Class RingBufferLogEvent
- java.lang.Object
-
- org.apache.logging.log4j.core.async.RingBufferLogEvent
-
- All Implemented Interfaces:
java.io.Serializable,java.lang.CharSequence,LogEvent,Message,ParameterVisitable,ReusableMessage,StringBuilderFormattable
public class RingBufferLogEvent extends java.lang.Object implements LogEvent, ReusableMessage, java.lang.CharSequence, ParameterVisitable
When the Disruptor is started, the RingBuffer is populated with event objects. These objects are then re-used during the life of the RingBuffer.- See Also:
- Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classRingBufferLogEvent.FactoryCreates the events that will be put in the RingBuffer.
-
Field Summary
Fields Modifier and Type Field Description private AsyncLoggerasyncLoggerprivate StringMapcontextDataprivate ThreadContext.ContextStackcontextStackprivate static MessageEMPTYprivate booleanendOfBatchstatic RingBufferLogEvent.FactoryFACTORYTheEventFactoryforRingBufferLogEvents.private java.lang.Stringfqcnprivate booleanincludeLocationprivate MutableInstantinstantprivate Levellevelprivate java.lang.StackTraceElementlocationprivate java.lang.StringloggerNameprivate Markermarkerprivate Messagemessageprivate java.lang.StringmessageFormatprivate java.lang.StringBuildermessageTextprivate longnanoTimeprivate shortparameterCountprivate java.lang.Object[]parametersprivate booleanpopulatedprivate static longserialVersionUIDprivate longthreadIdprivate java.lang.StringthreadNameprivate intthreadPriorityprivate java.lang.Throwablethrownprivate ThrowableProxythrownProxy
-
Constructor Summary
Constructors Constructor Description RingBufferLogEvent()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description charcharAt(int index)voidclear()Release references held by ring buffer to allow objects to be garbage-collected.LogEventcreateMemento()Creates and returns a new immutable copy of thisRingBufferLogEvent.voidexecute(boolean endOfBatch)Event processor that reads the event from the ringbuffer can call this method.<S> voidforEachParameter(ParameterConsumer<S> action, S state)Performs the given action for each parameter until all values have been processed or the action throws an exception.voidformatTo(java.lang.StringBuilder buffer)Writes a text representation of this object into the specifiedStringBuilder, ideally without allocating temporary objects.ReadOnlyStringMapgetContextData()Returns theReadOnlyStringMapobject holding context data key-value pairs.java.util.Map<java.lang.String,java.lang.String>getContextMap()Gets the context map (also know as Mapped Diagnostic Context or MDC).ThreadContext.ContextStackgetContextStack()Gets the context stack (also known as Nested Diagnostic Context or NDC).java.lang.StringgetFormat()Gets the format portion of the Message.java.lang.StringgetFormattedMessage()Gets the Message formatted as a String.InstantgetInstant()Returns the Instant when the message was logged.LevelgetLevel()Gets the level.java.lang.StringgetLoggerFqcn()Returns the fully qualified class name of the caller of the logging API.java.lang.StringgetLoggerName()Gets the logger name.MarkergetMarker()Gets the Marker associated with the event.MessagegetMessage()Gets the message associated with the event.private java.lang.StringBuildergetMessageTextForWriting()longgetNanoTime()Returns the value of the running Java Virtual Machine's high-resolution time source when this event was created, or a dummy value if it is known that this value will not be used downstream.shortgetParameterCount()Returns the number of parameters that was used to initialize this reusable message for the current content.java.lang.Object[]getParameters()Gets parameter values, if any.java.lang.StackTraceElementgetSource()Gets the source of logging request.longgetThreadId()Gets the thread ID.java.lang.StringgetThreadName()Gets the thread name.intgetThreadPriority()Gets the thread priority.java.lang.ThrowablegetThrowable()Gets the throwable, if any.java.lang.ThrowablegetThrown()Gets throwable associated with logging request.ThrowableProxygetThrownProxy()Gets throwable proxy associated with logging request.longgetTimeMillis()Gets event time in milliseconds since midnight, January 1, 1970 UTC.voidinitializeBuilder(Log4jLogEvent.Builder builder)Initializes the specifiedLog4jLogEvent.Builderfrom thisRingBufferLogEvent.private voidinitTime(Clock clock)booleanisEndOfBatch()Returnstrueif this event is the end of a batch,falseotherwise.booleanisIncludeLocation()Returns whether the source of the logging request is required downstream.booleanisPopulated()intlength()Messagememento()Returns an immutable snapshot of the current internal state of this reusable message.(package private) voidsetContextData(StringMap contextData)voidsetEndOfBatch(boolean endOfBatch)Sets whether this event is the last one in a batch.voidsetIncludeLocation(boolean includeLocation)Sets whether the source of the logging request is required downstream.private voidsetMessage(Message msg)voidsetValues(AsyncLogger anAsyncLogger, java.lang.String aLoggerName, Marker aMarker, java.lang.String theFqcn, Level aLevel, Message msg, java.lang.Throwable aThrowable, StringMap mutableContextData, ThreadContext.ContextStack aContextStack, long threadId, java.lang.String threadName, int threadPriority, java.lang.StackTraceElement aLocation, Clock clock, NanoClock nanoClock)java.lang.CharSequencesubSequence(int start, int end)java.lang.Object[]swapParameters(java.lang.Object[] emptyReplacement)Replaces this ReusableMessage's parameter array with the specified value and return the original arrayLogEventtoImmutable()Returns an immutable version of this log event, which MAY BE a copy of this event.private voidwriteObject(java.io.ObjectOutputStream out)
-
-
-
Field Detail
-
FACTORY
public static final RingBufferLogEvent.Factory FACTORY
TheEventFactoryforRingBufferLogEvents.
-
serialVersionUID
private static final long serialVersionUID
- See Also:
- Constant Field Values
-
EMPTY
private static final Message EMPTY
-
populated
private boolean populated
-
threadPriority
private int threadPriority
-
threadId
private long threadId
-
instant
private final MutableInstant instant
-
nanoTime
private long nanoTime
-
parameterCount
private short parameterCount
-
includeLocation
private boolean includeLocation
-
endOfBatch
private boolean endOfBatch
-
level
private Level level
-
threadName
private java.lang.String threadName
-
loggerName
private java.lang.String loggerName
-
message
private Message message
-
messageFormat
private java.lang.String messageFormat
-
messageText
private java.lang.StringBuilder messageText
-
parameters
private java.lang.Object[] parameters
-
thrown
private transient java.lang.Throwable thrown
-
thrownProxy
private ThrowableProxy thrownProxy
-
contextData
private StringMap contextData
-
marker
private Marker marker
-
fqcn
private java.lang.String fqcn
-
location
private java.lang.StackTraceElement location
-
contextStack
private ThreadContext.ContextStack contextStack
-
asyncLogger
private transient AsyncLogger asyncLogger
-
-
Method Detail
-
setValues
public void setValues(AsyncLogger anAsyncLogger, java.lang.String aLoggerName, Marker aMarker, java.lang.String theFqcn, Level aLevel, Message msg, java.lang.Throwable aThrowable, StringMap mutableContextData, ThreadContext.ContextStack aContextStack, long threadId, java.lang.String threadName, int threadPriority, java.lang.StackTraceElement aLocation, Clock clock, NanoClock nanoClock)
-
initTime
private void initTime(Clock clock)
-
toImmutable
public LogEvent toImmutable()
Description copied from interface:LogEventReturns an immutable version of this log event, which MAY BE a copy of this event.- Specified by:
toImmutablein interfaceLogEvent- Returns:
- an immutable version of this log event
-
setMessage
private void setMessage(Message msg)
-
getMessageTextForWriting
private java.lang.StringBuilder getMessageTextForWriting()
-
execute
public void execute(boolean endOfBatch)
Event processor that reads the event from the ringbuffer can call this method.- Parameters:
endOfBatch- flag to indicate if this is the last event in a batch from the RingBuffer
-
isPopulated
public boolean isPopulated()
- Returns:
trueif this event is populated with data,falseotherwise
-
isEndOfBatch
public boolean isEndOfBatch()
Returnstrueif this event is the end of a batch,falseotherwise.- Specified by:
isEndOfBatchin interfaceLogEvent- Returns:
trueif this event is the end of a batch,falseotherwise
-
setEndOfBatch
public void setEndOfBatch(boolean endOfBatch)
Description copied from interface:LogEventSets whether this event is the last one in a batch. Used by asynchronous Loggers and Appenders to signal to buffered downstream components when to flush to disk, as a more efficient alternative to theimmediateFlush=trueconfiguration.- Specified by:
setEndOfBatchin interfaceLogEvent- Parameters:
endOfBatch-trueif this event is the last one in a batch,falseotherwise.
-
isIncludeLocation
public boolean isIncludeLocation()
Description copied from interface:LogEventReturns whether the source of the logging request is required downstream. Asynchronous Loggers and Appenders use this flag to determine whether to take aStackTracesnapshot or not before handing off this event to another thread.- Specified by:
isIncludeLocationin interfaceLogEvent- Returns:
trueif the source of the logging request is required downstream,falseotherwise.- See Also:
LogEvent.getSource()
-
setIncludeLocation
public void setIncludeLocation(boolean includeLocation)
Description copied from interface:LogEventSets whether the source of the logging request is required downstream. Asynchronous Loggers and Appenders use this flag to determine whether to take aStackTracesnapshot or not before handing off this event to another thread.- Specified by:
setIncludeLocationin interfaceLogEvent- Parameters:
includeLocation-trueif the source of the logging request is required downstream,falseotherwise.- See Also:
LogEvent.getSource()
-
getLoggerName
public java.lang.String getLoggerName()
Description copied from interface:LogEventGets the logger name.- Specified by:
getLoggerNamein interfaceLogEvent- Returns:
- logger name, may be
null.
-
getMarker
public Marker getMarker()
Description copied from interface:LogEventGets the Marker associated with the event.
-
getLoggerFqcn
public java.lang.String getLoggerFqcn()
Description copied from interface:LogEventReturns the fully qualified class name of the caller of the logging API.- Specified by:
getLoggerFqcnin interfaceLogEvent- Returns:
- The fully qualified class name of the caller.
-
getMessage
public Message getMessage()
Description copied from interface:LogEventGets the message associated with the event.- Specified by:
getMessagein interfaceLogEvent- Returns:
- message.
-
getFormattedMessage
public java.lang.String getFormattedMessage()
Description copied from interface:MessageGets the Message formatted as a String. Each Message implementation determines the appropriate way to format the data encapsulated in the Message. Messages that provide more than one way of formatting the Message will implement MultiformatMessage.When configured to log asynchronously, this method is called before the Message is queued, unless this message implements
ReusableMessageor is annotated withAsynchronouslyFormattable. This gives the Message implementation class a chance to create a formatted message String with the current value of any mutable objects. The intention is that the Message implementation caches this formatted message and returns it on subsequent calls. (See LOG4J2-763.)When logging synchronously, this method will not be called for Messages that implement the
StringBuilderFormattableinterface: instead, theformatTo(StringBuilder)method will be called so the Message can format its contents without creating intermediate String objects.- Specified by:
getFormattedMessagein interfaceMessage- Returns:
- The message String.
- See Also:
Message.getFormattedMessage()
-
getFormat
public java.lang.String getFormat()
Description copied from interface:MessageGets the format portion of the Message.- Specified by:
getFormatin interfaceMessage- Returns:
- The message format. Some implementations, such as ParameterizedMessage, will use this as the message "pattern". Other Messages may simply return an empty String. TODO Do all messages have a format? What syntax? Using a Formatter object could be cleaner. (RG) In SimpleMessage the format is identical to the formatted message. In ParameterizedMessage and StructuredDataMessage it is not. It is up to the Message implementer to determine what this method will return. A Formatter is inappropriate as this is very specific to the Message implementation so it isn't clear to me how having a Formatter separate from the Message would be cleaner.
- See Also:
Message.getFormat()
-
getParameters
public java.lang.Object[] getParameters()
Description copied from interface:MessageGets parameter values, if any.- Specified by:
getParametersin interfaceMessage- Returns:
- An array of parameter values or null.
- See Also:
Message.getParameters()
-
getThrowable
public java.lang.Throwable getThrowable()
Description copied from interface:MessageGets the throwable, if any.- Specified by:
getThrowablein interfaceMessage- Returns:
- the throwable or null.
- See Also:
Message.getThrowable()
-
formatTo
public void formatTo(java.lang.StringBuilder buffer)
Description copied from interface:StringBuilderFormattableWrites a text representation of this object into the specifiedStringBuilder, ideally without allocating temporary objects.- Specified by:
formatToin interfaceStringBuilderFormattable- Parameters:
buffer- the StringBuilder to write into- See Also:
StringBuilderFormattable.formatTo(StringBuilder)
-
swapParameters
public java.lang.Object[] swapParameters(java.lang.Object[] emptyReplacement)
Replaces this ReusableMessage's parameter array with the specified value and return the original array- Specified by:
swapParametersin interfaceReusableMessage- Parameters:
emptyReplacement- the parameter array that can be used for subsequent uses of this reusable message- Returns:
- the original parameter array
- See Also:
ReusableMessage.swapParameters(Object[])
-
getParameterCount
public short getParameterCount()
Description copied from interface:ReusableMessageReturns the number of parameters that was used to initialize this reusable message for the current content.The parameter array returned by
ReusableMessage.swapParameters(Object[])may be larger than the actual number of parameters. Callers should use this method to determine how many elements the array contains.- Specified by:
getParameterCountin interfaceReusableMessage- Returns:
- the current number of parameters
-
forEachParameter
public <S> void forEachParameter(ParameterConsumer<S> action, S state)
Description copied from interface:ParameterVisitablePerforms the given action for each parameter until all values have been processed or the action throws an exception.The second parameter lets callers pass in a stateful object to be modified with the key-value pairs, so the TriConsumer implementation itself can be stateless and potentially reusable.
- Specified by:
forEachParameterin interfaceParameterVisitable- Type Parameters:
S- type of the third parameter- Parameters:
action- The action to be performed for each key-value pair in this collectionstate- the object to be passed as the third parameter to each invocation on the specified ParameterConsumer.
-
memento
public Message memento()
Description copied from interface:ReusableMessageReturns an immutable snapshot of the current internal state of this reusable message. The returned snapshot will not be affected by subsequent modifications of this reusable message.- Specified by:
mementoin interfaceReusableMessage- Returns:
- an immutable snapshot of this message
-
length
public int length()
- Specified by:
lengthin interfacejava.lang.CharSequence
-
charAt
public char charAt(int index)
- Specified by:
charAtin interfacejava.lang.CharSequence
-
subSequence
public java.lang.CharSequence subSequence(int start, int end)- Specified by:
subSequencein interfacejava.lang.CharSequence
-
getThrown
public java.lang.Throwable getThrown()
Description copied from interface:LogEventGets throwable associated with logging request.Convenience method for
ThrowableProxy.getThrowable();
-
getThrownProxy
public ThrowableProxy getThrownProxy()
Description copied from interface:LogEventGets throwable proxy associated with logging request.- Specified by:
getThrownProxyin interfaceLogEvent- Returns:
- throwable, may be null.
-
getContextData
public ReadOnlyStringMap getContextData()
Description copied from interface:LogEventReturns theReadOnlyStringMapobject holding context data key-value pairs.Context data (also known as Mapped Diagnostic Context or MDC) is data that is set by the application to be included in all subsequent log events. The default source for context data is the
ThreadContext(and properties configured on the Logger that logged the event), but users can configure a customContextDataInjectorto inject key-value pairs from any arbitrary source.- Specified by:
getContextDatain interfaceLogEvent- Returns:
- the
ReadOnlyStringMapobject holding context data key-value pairs - See Also:
ContextDataInjector,ThreadContext
-
setContextData
void setContextData(StringMap contextData)
-
getContextMap
public java.util.Map<java.lang.String,java.lang.String> getContextMap()
Description copied from interface:LogEventGets the context map (also know as Mapped Diagnostic Context or MDC).- Specified by:
getContextMapin interfaceLogEvent- Returns:
- The context map, never
null.
-
getContextStack
public ThreadContext.ContextStack getContextStack()
Description copied from interface:LogEventGets the context stack (also known as Nested Diagnostic Context or NDC).- Specified by:
getContextStackin interfaceLogEvent- Returns:
- The context stack, never
null.
-
getThreadId
public long getThreadId()
Description copied from interface:LogEventGets the thread ID.- Specified by:
getThreadIdin interfaceLogEvent- Returns:
- thread ID.
-
getThreadName
public java.lang.String getThreadName()
Description copied from interface:LogEventGets the thread name.- Specified by:
getThreadNamein interfaceLogEvent- Returns:
- thread name, may be null. TODO guess this could go into a thread context object too. (RG) Why?
-
getThreadPriority
public int getThreadPriority()
Description copied from interface:LogEventGets the thread priority.- Specified by:
getThreadPriorityin interfaceLogEvent- Returns:
- thread priority.
-
getSource
public java.lang.StackTraceElement getSource()
Description copied from interface:LogEventGets the source of logging request.
-
getTimeMillis
public long getTimeMillis()
Description copied from interface:LogEventGets event time in milliseconds since midnight, January 1, 1970 UTC. UseLogEvent.getInstant()to get higher precision timestamp information if available on this platform.- Specified by:
getTimeMillisin interfaceLogEvent- Returns:
- the milliseconds component of this log event's timestamp
- See Also:
System.currentTimeMillis()
-
getInstant
public Instant getInstant()
Description copied from interface:LogEventReturns the Instant when the message was logged.Caution: if this
LogEventimplementation is mutable and reused for multiple consecutive log messages, then theInstantobject returned by this method is also mutable and reused. Client code should not keep a reference to the returned object but make a copy instead.- Specified by:
getInstantin interfaceLogEvent- Returns:
- the
Instantholding Instant details for this log event
-
getNanoTime
public long getNanoTime()
Description copied from interface:LogEventReturns the value of the running Java Virtual Machine's high-resolution time source when this event was created, or a dummy value if it is known that this value will not be used downstream.- Specified by:
getNanoTimein interfaceLogEvent- Returns:
- The value of the running Java Virtual Machine's high-resolution time source when this event was created.
-
clear
public void clear()
Release references held by ring buffer to allow objects to be garbage-collected.
-
writeObject
private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException- Throws:
java.io.IOException
-
createMemento
public LogEvent createMemento()
Creates and returns a new immutable copy of thisRingBufferLogEvent.- Returns:
- a new immutable copy of the data in this
RingBufferLogEvent
-
initializeBuilder
public void initializeBuilder(Log4jLogEvent.Builder builder)
Initializes the specifiedLog4jLogEvent.Builderfrom thisRingBufferLogEvent.- Parameters:
builder- the builder whose fields to populate
-
-