public class AsyncLogger extends Logger implements com.lmax.disruptor.EventTranslatorVararg<RingBufferLogEvent>
To use AsyncLogger, specify the System property
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
before you obtain a
Logger, and all Loggers returned by LogManager.getLogger will be AsyncLoggers.
Note that for performance reasons, this logger does not include source location by default. You need to specify
includeLocation="true"
in the configuration or any %class, %location or %line conversion patterns in your
log4j.xml configuration will produce either a "?" character or no output at all.
For best performance, use AsyncLogger with the RandomAccessFileAppender or RollingRandomAccessFileAppender, with immediateFlush=false. These appenders have built-in support for the batching mechanism used by the Disruptor library, and they will flush to disk at the end of each batch. This means that even with immediateFlush=false, there will never be any items left in the buffer; all log events will all be written to disk in a very efficient manner.
Modifier and Type | Class and Description |
---|---|
(package private) class |
AsyncLogger.TranslatorType |
Logger.LoggerProxy, Logger.PrivateConfig
Modifier and Type | Field and Description |
---|---|
private static Clock |
CLOCK |
private static ContextDataInjector |
CONTEXT_DATA_INJECTOR |
private boolean |
includeLocation |
private static StatusLogger |
LOGGER |
private AsyncLoggerDisruptor |
loggerDisruptor |
private NanoClock |
nanoClock |
private static ThreadNameCachingStrategy |
THREAD_NAME_CACHING_STRATEGY |
private java.lang.ThreadLocal<RingBufferLogEventTranslator> |
threadLocalTranslator |
private AsyncLogger.TranslatorType |
threadLocalTranslatorType |
private AsyncLogger.TranslatorType |
varargTranslatorType |
privateConfig
CATCHING_MARKER, DEFAULT_FLOW_MESSAGE_FACTORY_CLASS, DEFAULT_MESSAGE_FACTORY_CLASS, ENTRY_MARKER, EXCEPTION_MARKER, EXIT_MARKER, FLOW_MARKER, logBuilder, name, THROWING_MARKER
Constructor and Description |
---|
AsyncLogger(LoggerContext context,
java.lang.String name,
MessageFactory messageFactory,
AsyncLoggerDisruptor loggerDisruptor)
Constructs an
AsyncLogger with the specified context, name and message factory. |
Modifier and Type | Method and Description |
---|---|
void |
actualAsyncLog(RingBufferLogEvent event)
This method is called by the EventHandler that processes the RingBufferLogEvent in a separate thread.
|
private java.lang.StackTraceElement |
calcLocationIfRequested(java.lang.String fqcn)
Returns the caller location if requested,
null otherwise. |
private RingBufferLogEventTranslator |
getCachedTranslator() |
private static StringMap |
getContextData(RingBufferLogEvent event) |
(package private) NanoClock |
getNanoClock() |
private AsyncLogger.TranslatorType |
getTranslatorType() |
private void |
handleRingBufferFull(RingBufferLogEventTranslator translator) |
private void |
handleRingBufferFull(java.lang.StackTraceElement location,
java.lang.String fqcn,
Level level,
Marker marker,
Message msg,
java.lang.Throwable thrown) |
private void |
initTranslator(RingBufferLogEventTranslator translator,
java.lang.String fqcn,
Level level,
Marker marker,
Message message,
java.lang.Throwable thrown) |
private void |
initTranslator(RingBufferLogEventTranslator translator,
java.lang.String fqcn,
java.lang.StackTraceElement location,
Level level,
Marker marker,
Message message,
java.lang.Throwable thrown) |
private void |
initTranslatorThreadValues(RingBufferLogEventTranslator translator) |
private boolean |
isReused(Message message) |
void |
log(Level level,
Marker marker,
java.lang.String fqcn,
java.lang.StackTraceElement location,
Message message,
java.lang.Throwable throwable) |
void |
logMessage(java.lang.String fqcn,
Level level,
Marker marker,
Message message,
java.lang.Throwable thrown)
Always logs a message at the specified level.
|
(package private) void |
logMessageInCurrentThread(java.lang.String fqcn,
Level level,
Marker marker,
Message message,
java.lang.Throwable thrown)
LOG4J2-471: prevent deadlock when RingBuffer is full and object being logged calls Logger.log() from its
toString() method
|
private void |
logWithThreadLocalTranslator(java.lang.String fqcn,
Level level,
Marker marker,
Message message,
java.lang.Throwable thrown)
Enqueues the specified log event data for logging in a background thread.
|
private void |
logWithThreadLocalTranslator(java.lang.String fqcn,
java.lang.StackTraceElement location,
Level level,
Marker marker,
Message message,
java.lang.Throwable thrown)
Enqueues the specified log event data for logging in a background thread.
|
private void |
logWithVarargTranslator(java.lang.String fqcn,
Level level,
Marker marker,
Message message,
java.lang.Throwable thrown)
Enqueues the specified log event data for logging in a background thread.
|
private void |
logWithVarargTranslator(java.lang.String fqcn,
java.lang.StackTraceElement location,
Level level,
Marker marker,
Message message,
java.lang.Throwable thrown)
Enqueues the specified log event data for logging in a background thread.
|
private void |
onPropertiesPresent(RingBufferLogEvent event,
java.util.List<Property> properties) |
private void |
publish(RingBufferLogEventTranslator translator) |
void |
translateTo(RingBufferLogEvent event,
long sequence,
java.lang.Object... args) |
protected void |
updateConfiguration(Configuration newConfig)
Associates this Logger with a new Configuration.
|
addAppender, addFilter, equals, filterCount, get, getAppenders, getContext, getFilters, getLevel, getParent, hashCode, isAdditive, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, isEnabled, removeAppender, requiresLocation, setAdditive, setLevel, toString, writeReplace
always, atDebug, atError, atFatal, atInfo, atLevel, atTrace, atWarn, catching, catching, catching, catchingMsg, checkMessageFactory, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, debug, enter, enter, enter, enter, enter, entry, entry, entry, entryMsg, entryMsg, entryMsg, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, error, exit, exit, exit, exit, exitMsg, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, fatal, getMessageFactory, getName, getRecursionDepth, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, info, isDebugEnabled, isDebugEnabled, isEnabled, isEnabled, isErrorEnabled, isErrorEnabled, isFatalEnabled, isFatalEnabled, isInfoEnabled, isInfoEnabled, isTraceEnabled, isTraceEnabled, isWarnEnabled, isWarnEnabled, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, log, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logIfEnabled, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, logMessage, printf, printf, throwing, throwing, throwing, throwingMsg, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, trace, traceEntry, traceEntry, traceEntry, traceEntry, traceEntry, traceExit, traceExit, traceExit, traceExit, traceExit, traceExit, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn, warn
private static final StatusLogger LOGGER
private static final Clock CLOCK
private static final ContextDataInjector CONTEXT_DATA_INJECTOR
private static final ThreadNameCachingStrategy THREAD_NAME_CACHING_STRATEGY
private final java.lang.ThreadLocal<RingBufferLogEventTranslator> threadLocalTranslator
private final AsyncLoggerDisruptor loggerDisruptor
private volatile boolean includeLocation
private volatile NanoClock nanoClock
private final AsyncLogger.TranslatorType threadLocalTranslatorType
private final AsyncLogger.TranslatorType varargTranslatorType
public AsyncLogger(LoggerContext context, java.lang.String name, MessageFactory messageFactory, AsyncLoggerDisruptor loggerDisruptor)
AsyncLogger
with the specified context, name and message factory.context
- context of this loggername
- name of this loggermessageFactory
- message factory of this loggerloggerDisruptor
- helper class that logging can be delegated to. This object owns the Disruptor.protected void updateConfiguration(Configuration newConfig)
Logger
There are two ways this could be used to guarantee all threads are aware of changes to config.
updateConfiguration
in class Logger
newConfig
- The new Configuration.NanoClock getNanoClock()
private RingBufferLogEventTranslator getCachedTranslator()
public void logMessage(java.lang.String fqcn, Level level, Marker marker, Message message, java.lang.Throwable thrown)
ExtendedLogger
logMessage
in interface ExtendedLogger
logMessage
in class Logger
fqcn
- The fully qualified class name of the logger entry point, used to determine the caller class and
method when location information needs to be logged.level
- The logging Level to check.marker
- A Marker or null.message
- The Message.thrown
- the exception to log, including its stack trace.public void log(Level level, Marker marker, java.lang.String fqcn, java.lang.StackTraceElement location, Message message, java.lang.Throwable throwable)
private AsyncLogger.TranslatorType getTranslatorType()
private boolean isReused(Message message)
private void logWithThreadLocalTranslator(java.lang.String fqcn, Level level, Marker marker, Message message, java.lang.Throwable thrown)
This re-uses a RingBufferLogEventTranslator
instance cached in a ThreadLocal
to avoid creating
unnecessary objects with each event.
fqcn
- fully qualified name of the callerlevel
- level at which the caller wants to log the messagemarker
- message markermessage
- the log messagethrown
- a Throwable
or null
private void logWithThreadLocalTranslator(java.lang.String fqcn, java.lang.StackTraceElement location, Level level, Marker marker, Message message, java.lang.Throwable thrown)
This re-uses a RingBufferLogEventTranslator
instance cached in a ThreadLocal
to avoid creating
unnecessary objects with each event.
fqcn
- fully qualified name of the callerlocation
- the Location of the caller.level
- level at which the caller wants to log the messagemarker
- message markermessage
- the log messagethrown
- a Throwable
or null
private void publish(RingBufferLogEventTranslator translator)
private void handleRingBufferFull(RingBufferLogEventTranslator translator)
private void initTranslator(RingBufferLogEventTranslator translator, java.lang.String fqcn, java.lang.StackTraceElement location, Level level, Marker marker, Message message, java.lang.Throwable thrown)
private void initTranslator(RingBufferLogEventTranslator translator, java.lang.String fqcn, Level level, Marker marker, Message message, java.lang.Throwable thrown)
private void initTranslatorThreadValues(RingBufferLogEventTranslator translator)
private java.lang.StackTraceElement calcLocationIfRequested(java.lang.String fqcn)
null
otherwise.fqcn
- fully qualified caller name.null
otherwise.private void logWithVarargTranslator(java.lang.String fqcn, Level level, Marker marker, Message message, java.lang.Throwable thrown)
This creates a new varargs Object array for each invocation, but does not store any non-JDK classes in a
ThreadLocal
to avoid memory leaks in web applications (see LOG4J2-1172).
fqcn
- fully qualified name of the callerlevel
- level at which the caller wants to log the messagemarker
- message markermessage
- the log messagethrown
- a Throwable
or null
private void logWithVarargTranslator(java.lang.String fqcn, java.lang.StackTraceElement location, Level level, Marker marker, Message message, java.lang.Throwable thrown)
This creates a new varargs Object array for each invocation, but does not store any non-JDK classes in a
ThreadLocal
to avoid memory leaks in web applications (see LOG4J2-1172).
fqcn
- fully qualified name of the callerlocation
- location of the caller.level
- level at which the caller wants to log the messagemarker
- message markermessage
- the log messagethrown
- a Throwable
or null
public void translateTo(RingBufferLogEvent event, long sequence, java.lang.Object... args)
translateTo
in interface com.lmax.disruptor.EventTranslatorVararg<RingBufferLogEvent>
void logMessageInCurrentThread(java.lang.String fqcn, Level level, Marker marker, Message message, java.lang.Throwable thrown)
fqcn
- fully qualified caller namelevel
- log levelmarker
- optional markermessage
- log messagethrown
- optional exceptionprivate void handleRingBufferFull(java.lang.StackTraceElement location, java.lang.String fqcn, Level level, Marker marker, Message msg, java.lang.Throwable thrown)
public void actualAsyncLog(RingBufferLogEvent event)
event
- the event to logprivate void onPropertiesPresent(RingBufferLogEvent event, java.util.List<Property> properties)
private static StringMap getContextData(RingBufferLogEvent event)