Class AsyncLoggerConfigDisruptor
java.lang.Object
org.apache.logging.log4j.core.AbstractLifeCycle
org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor
- All Implemented Interfaces:
AsyncLoggerConfigDelegate,LifeCycle,LifeCycle2
public class AsyncLoggerConfigDisruptor
extends AbstractLifeCycle
implements AsyncLoggerConfigDelegate
Helper class decoupling the
AsyncLoggerConfig class from the LMAX Disruptor library.
AsyncLoggerConfig is a plugin, and will be loaded even if users do not configure any <asyncLogger> or
<asyncRoot> elements in the configuration. If AsyncLoggerConfig has inner classes that extend or
implement classes from the Disruptor library, a NoClassDefFoundError is thrown if the Disruptor jar is not in
the classpath when the PluginManager loads the AsyncLoggerConfig plugin from the pre-defined plugins
definition file.
This class serves to make the dependency on the Disruptor optional, so that these classes are only loaded when the
AsyncLoggerConfig is actually used.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classRingBuffer events contain all information necessary to perform the work in a separate thread.private static classEventHandler performs the work in a separate thread.Nested classes/interfaces inherited from interface org.apache.logging.log4j.core.LifeCycle
LifeCycle.State -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate booleanprivate AsyncQueueFullPolicyprivate longprivate com.lmax.disruptor.dsl.Disruptor<AsyncLoggerConfigDisruptor.Log4jEventWrapper> private com.lmax.disruptor.EventFactory<AsyncLoggerConfigDisruptor.Log4jEventWrapper> private static final com.lmax.disruptor.EventFactory<AsyncLoggerConfigDisruptor.Log4jEventWrapper> Factory used to populate the RingBuffer with events.private static final intprivate Booleanprivate static final com.lmax.disruptor.EventFactory<AsyncLoggerConfigDisruptor.Log4jEventWrapper> Factory used to populate the RingBuffer with events.private static final com.lmax.disruptor.EventTranslatorTwoArg<AsyncLoggerConfigDisruptor.Log4jEventWrapper, LogEvent, AsyncLoggerConfig> Object responsible for passing on data to a RingBuffer event with a MutableLogEvent.private final Objectprivate intprivate static final intprivate com.lmax.disruptor.EventTranslatorTwoArg<AsyncLoggerConfigDisruptor.Log4jEventWrapper, LogEvent, AsyncLoggerConfig> private static final com.lmax.disruptor.EventTranslatorTwoArg<AsyncLoggerConfigDisruptor.Log4jEventWrapper, LogEvent, AsyncLoggerConfig> Object responsible for passing on data to a specific RingBuffer event.Fields inherited from class org.apache.logging.log4j.core.AbstractLifeCycle
DEFAULT_STOP_TIMEOUT, DEFAULT_STOP_TIMEUNIT, LOGGER -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptioncreateRingBufferAdmin(String contextName, String loggerConfigName) Creates and returns a newRingBufferAdminthat instruments the ringbuffer of thisAsyncLoggerConfig.private voidenqueue(LogEvent logEvent, AsyncLoggerConfig asyncLoggerConfig) voidenqueueEvent(LogEvent event, AsyncLoggerConfig asyncLoggerConfig) Enqueues theLogEventon the mixed configuration ringbuffer.private LogEventensureImmutable(LogEvent event) getEventRoute(Level logLevel) Returns theEventRoutefor the event with the specified level.private static booleanhasBacklog(com.lmax.disruptor.dsl.Disruptor<?> theDisruptor) Returnstrueif the specified disruptor still has unprocessed events.private booleanhasLog4jBeenShutDown(com.lmax.disruptor.dsl.Disruptor<AsyncLoggerConfigDisruptor.Log4jEventWrapper> aDisruptor) Returnstrueif the specified disruptor is null.private LogEventprepareEvent(LogEvent event) private intvoidsetLogEventFactory(LogEventFactory logEventFactory) Notifies the delegate what LogEventFactory an AsyncLoggerConfig is using, so the delegate can determine whether to populate the ring buffer with mutable log events or not.private voidvoidstart()Increases the reference count and creates and starts a new Disruptor and associated thread if none currently exists.booleanDecreases the reference count.private booleanbooleantryEnqueue(LogEvent event, AsyncLoggerConfig asyncLoggerConfig) Methods inherited from class org.apache.logging.log4j.core.AbstractLifeCycle
equalsImpl, getState, getStatusLogger, hashCodeImpl, initialize, isInitialized, isStarted, isStarting, isStopped, isStopping, setStarted, setStarting, setState, setStopped, setStopping, stop, stop
-
Field Details
-
MAX_DRAIN_ATTEMPTS_BEFORE_SHUTDOWN
private static final int MAX_DRAIN_ATTEMPTS_BEFORE_SHUTDOWN- See Also:
-
SLEEP_MILLIS_BETWEEN_DRAIN_ATTEMPTS
private static final int SLEEP_MILLIS_BETWEEN_DRAIN_ATTEMPTS- See Also:
-
FACTORY
private static final com.lmax.disruptor.EventFactory<AsyncLoggerConfigDisruptor.Log4jEventWrapper> FACTORYFactory used to populate the RingBuffer with events. These event objects are then re-used during the life of the RingBuffer. -
MUTABLE_FACTORY
private static final com.lmax.disruptor.EventFactory<AsyncLoggerConfigDisruptor.Log4jEventWrapper> MUTABLE_FACTORYFactory used to populate the RingBuffer with events. These event objects are then re-used during the life of the RingBuffer. -
TRANSLATOR
private static final com.lmax.disruptor.EventTranslatorTwoArg<AsyncLoggerConfigDisruptor.Log4jEventWrapper,LogEvent, TRANSLATORAsyncLoggerConfig> Object responsible for passing on data to a specific RingBuffer event. -
MUTABLE_TRANSLATOR
private static final com.lmax.disruptor.EventTranslatorTwoArg<AsyncLoggerConfigDisruptor.Log4jEventWrapper,LogEvent, MUTABLE_TRANSLATORAsyncLoggerConfig> Object responsible for passing on data to a RingBuffer event with a MutableLogEvent. -
ringBufferSize
private int ringBufferSize -
asyncQueueFullPolicy
-
mutable
-
disruptor
private volatile com.lmax.disruptor.dsl.Disruptor<AsyncLoggerConfigDisruptor.Log4jEventWrapper> disruptor -
backgroundThreadId
private long backgroundThreadId -
factory
-
translator
private com.lmax.disruptor.EventTranslatorTwoArg<AsyncLoggerConfigDisruptor.Log4jEventWrapper,LogEvent, translatorAsyncLoggerConfig> -
alreadyLoggedWarning
private volatile boolean alreadyLoggedWarning -
queueFullEnqueueLock
-
-
Constructor Details
-
AsyncLoggerConfigDisruptor
public AsyncLoggerConfigDisruptor()
-
-
Method Details
-
setLogEventFactory
Description copied from interface:AsyncLoggerConfigDelegateNotifies the delegate what LogEventFactory an AsyncLoggerConfig is using, so the delegate can determine whether to populate the ring buffer with mutable log events or not. This method may be invoked multiple times for all AsyncLoggerConfigs that use this delegate.- Specified by:
setLogEventFactoryin interfaceAsyncLoggerConfigDelegate- Parameters:
logEventFactory- the factory used
-
start
public void start()Increases the reference count and creates and starts a new Disruptor and associated thread if none currently exists.- Specified by:
startin interfaceLifeCycle- Overrides:
startin classAbstractLifeCycle- See Also:
-
stop
Decreases the reference count. If the reference count reached zero, the Disruptor and its associated thread are shut down and their references set tonull.- Specified by:
stopin interfaceLifeCycle2- Overrides:
stopin classAbstractLifeCycle- Parameters:
timeout- the maximum time to waittimeUnit- the time unit of the timeout argument- Returns:
- true if the receiver was stopped cleanly and normally, false otherwise.
-
hasBacklog
private static boolean hasBacklog(com.lmax.disruptor.dsl.Disruptor<?> theDisruptor) Returnstrueif the specified disruptor still has unprocessed events. -
getEventRoute
Description copied from interface:AsyncLoggerConfigDelegateReturns theEventRoutefor the event with the specified level.- Specified by:
getEventRoutein interfaceAsyncLoggerConfigDelegate- Parameters:
logLevel- the level of the event to log- Returns:
- the
EventRoute
-
remainingDisruptorCapacity
private int remainingDisruptorCapacity() -
hasLog4jBeenShutDown
private boolean hasLog4jBeenShutDown(com.lmax.disruptor.dsl.Disruptor<AsyncLoggerConfigDisruptor.Log4jEventWrapper> aDisruptor) Returnstrueif the specified disruptor is null. -
enqueueEvent
Description copied from interface:AsyncLoggerConfigDelegateEnqueues theLogEventon the mixed configuration ringbuffer. This method must only be used afterAsyncLoggerConfigDelegate.tryEnqueue(LogEvent, AsyncLoggerConfig)returnsfalseindicating that the ringbuffer is full, otherwise it may incur unnecessary synchronization.- Specified by:
enqueueEventin interfaceAsyncLoggerConfigDelegate
-
prepareEvent
-
showWarningAboutCustomLogEventWithReusableMessage
-
enqueue
-
synchronizeEnqueueWhenQueueFull
private boolean synchronizeEnqueueWhenQueueFull() -
tryEnqueue
- Specified by:
tryEnqueuein interfaceAsyncLoggerConfigDelegate
-
ensureImmutable
-
createRingBufferAdmin
Description copied from interface:AsyncLoggerConfigDelegateCreates and returns a newRingBufferAdminthat instruments the ringbuffer of thisAsyncLoggerConfig.- Specified by:
createRingBufferAdminin interfaceAsyncLoggerConfigDelegate- Parameters:
contextName- name of theLoggerContextloggerConfigName- name of the logger config- Returns:
- the RingBufferAdmin that instruments the ringbuffer
-