biz.paluch.logging.gelf.wildfly.WildFlyGelfLogHandler Maven / Gradle / Ivy
package biz.paluch.logging.gelf.wildfly;
import static biz.paluch.logging.gelf.LogMessageField.NamedLogField.*;
import java.util.logging.ErrorManager;
import java.util.logging.LogRecord;
import org.jboss.logmanager.ExtLogRecord;
import org.jboss.logmanager.errormanager.OnlyOnceErrorManager;
import biz.paluch.logging.gelf.GelfMessageAssembler;
import biz.paluch.logging.gelf.LogMessageField;
import biz.paluch.logging.gelf.MdcGelfMessageAssembler;
import biz.paluch.logging.gelf.intern.GelfMessage;
import biz.paluch.logging.gelf.jboss7.JBoss7JulLogEvent;
import biz.paluch.logging.gelf.jul.GelfLogHandler;
/**
* Logging-Handler for GELF (Graylog Extended Logging Format). This Java-Util-Logging Handler creates GELF Messages and posts
* them using UDP (default) or TCP. Following parameters are supported/needed:
*
* - host (Mandatory): Hostname/IP-Address of the Logstash Host
*
* - (the host) for UDP, e.g. 127.0.0.1 or some.host.com
* - See docs for more details
*
*
* - port (Optional): Port, default 12201
* - originHost (Optional): Originating Hostname, default FQDN Hostname
* - extractStacktrace (Optional): Post Stack-Trace to StackTrace field, default false
* - filterStackTrace (Optional): Perform Stack-Trace filtering (true/false), default false
* - mdcProfiling (Optional): Perform Profiling (Call-Duration) based on MDC Data. See MDC
* Profiling, default false
* - facility (Optional): Name of the Facility, default gelf-java
* - level (Optional): Log-Level, default INFO
* - filter (Optional): Class-Name of a Log-Filter, default none
* - additionalFields(number) (Optional): Post additional fields. Eg. fieldName=Value,field2=value2
* - additionalFieldTypes (Optional): Type specification for additional and MDC fields. Supported types: String, long, Long,
* double, Double and discover (default if not specified, discover field type on parseability). Eg. field=String,field2=double
* - mdcFields (Optional): Post additional fields, pull Values from MDC. Name of the Fields are comma-separated
* Application,Version,SomeOtherFieldName
* - dynamicMdcFields (Optional): Dynamic MDC Fields allows you to extract MDC values based on one or more regular
* expressions. Multiple regex are comma-separated. The name of the MDC entry is used as GELF field name. Eg.
* mdc.*,[mdc|MDC]fields
* - includeFullMdc (Optional): Include all fields from the MDC, default false
*
* MDC Profiling
*
* MDC Profiling allows to calculate the runtime from request start up to the time until the log message was generated. You must
* set one value in the MDC:
*
* - profiling.requestStart.millis: Time Millis of the Request-Start (Long or String)
*
*
* Two values are set by the Log Appender:
*
*
* - profiling.requestEnd: End-Time of the Request-End in Date.toString-representation
* - profiling.requestDuration: Duration of the request (e.g. 205ms, 16sec)
*
* The {@link #publish(LogRecord)} method is thread-safe and may be called by different threads at any time.
*
* @author Mark Paluch
*/
public class WildFlyGelfLogHandler extends GelfLogHandler {
private static final ErrorManager DEFAULT_ERROR_MANAGER = new OnlyOnceErrorManager();
public WildFlyGelfLogHandler() {
super();
super.setErrorManager(DEFAULT_ERROR_MANAGER);
}
protected void initializeDefaultFields() {
gelfMessageAssembler.addFields(LogMessageField.getDefaultMapping(Time, Severity, ThreadName, SourceClassName,
SourceMethodName, SourceSimpleClassName, LoggerName, NDC));
}
@Override
public void publish(LogRecord record) {
super.publish(ExtLogRecord.wrap(record));
}
@Override
protected GelfMessageAssembler createGelfMessageAssembler() {
return new MdcGelfMessageAssembler();
}
protected GelfMessage createGelfMessage(final LogRecord record) {
return getGelfMessageAssembler().createGelfMessage(new JBoss7JulLogEvent((ExtLogRecord) record));
}
public void setAdditionalFields(String fieldSpec) {
super.setAdditionalFields(fieldSpec);
}
public void setMdcFields(String fieldSpec) {
super.setMdcFields(fieldSpec);
}
public void setDynamicMdcFields(String fieldSpec) {
super.setDynamicMdcFields(fieldSpec);
}
public boolean isMdcProfiling() {
return getGelfMessageAssembler().isMdcProfiling();
}
public void setMdcProfiling(boolean mdcProfiling) {
getGelfMessageAssembler().setMdcProfiling(mdcProfiling);
}
public boolean isIncludeFullMdc() {
return getGelfMessageAssembler().isIncludeFullMdc();
}
public void setIncludeFullMdc(boolean includeFullMdc) {
getGelfMessageAssembler().setIncludeFullMdc(includeFullMdc);
}
private MdcGelfMessageAssembler getGelfMessageAssembler() {
return (MdcGelfMessageAssembler) gelfMessageAssembler;
}
}