[
https://issues.apache.org/jira/browse/LOG4J2-2816?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17082432#comment-17082432
]
Denis Orlov commented on LOG4J2-2816:
-------------------------------------
Our log4j2.component.properties:
{code}
# All properties which can be set via System Properties (will have more
priority) or here
# https://logging.apache.org/log4j/2.x/manual/configuration.html -> System
Properties
# Path to an XML or JSON Log4j 2 configuration file. May also contain a comma
separated list of configuration file names.
# log4j.configurationFile=
# The name of the class that implements the MergeStrategy interface.
# If not specified DefaultMergeStrategy will be used when creating a
CompositeConfiguration..
# log4j.mergeFactory=
# Creates the LoggerContexts. An application can have one or more active
LoggerContexts depending on the circumstances.
# See Log Separation for more details. Available context selector
implementation classes:
# org.apache.logging.log4j.core.async .AsyncLoggerContextSelector - makes all
loggers asynchronous.
# org.apache.logging.log4j.core.selector .BasicContextSelector - creates a
single shared LoggerContext.
# org.apache.logging.log4j.core.selector .ClassLoaderContextSelector - separate
LoggerContexts for each web application.
# org.apache.logging.log4j.core.selector .JndiContextSelector - use JNDI to
locate each web application's LoggerContext.
# org.apache.logging.log4j.core.osgi .BundleContextSelector - separate
LoggerContexts for each OSGi bundle.
# Default: ClassLoaderContextSelector
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
# Factory class used by LoggerConfig to create LogEvent instances. (Ignored
when the AsyncLoggerContextSelector is used.)
# Log4jLogEventFactory=org.apache.logging.log4j.core.impl
.DefaultLogEventFactory
# Factory class used by LogManager to bootstrap the logging implementation.
# The core jar provides org.apache.logging.log4j.core.impl.Log4jContextFactory.
# log4j2.loggerContextFactory=org.apache.logging.log4j.simple
.SimpleLoggerContextFactory
# Fully specified class name of a class extending
org.apache.logging.log4j.core.config.ConfigurationFactory.
# If specified, an instance of this class is added to the list of configuration
factories.
# log4j.configurationFactory
# Overrides the global flag for whether or not a shutdown hook should be used
to stop a LoggerContext.
# By default, this is enabled and can be disabled on a per-configuration basis.
# When running with the log4j-web module, this is automatically disabled.
# log4j.shutdownHookEnabled=true
# Fully specified class name of a class implementing ShutdownCallbackRegistry.
# If specified, an instance of this class is used instead of
DefaultShutdownCallbackRegistry.
# The specified class must have a default constructor.
#
log4j.shutdownCallbackRegistry=org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry
# Implementation of the org.apache.logging.log4j.core.util.Clock interface that
is used for timestamping the log events.
# By default, System.currentTimeMillis is called on every log event.
# You can also specify a fully qualified class name of a custom class that
implements the Clock interface.
# log4j.Clock=SystemClock
# Log level of the default configuration. The default configuration is used if
the ConfigurationFactory could
# not successfully create a configuration (e.g. no log4j2.xml file was found).
# org.apache.logging.log4j.level=ERROR
# If true, the ThreadContext stack and map are disabled. (May be ignored if a
custom ThreadContext map is specified.)
# Default: false
disableThreadContext=true
# If true, the ThreadContext stack is disabled.
# Default: false
disableThreadContextStack=true
# If true, the ThreadContext map is disabled. (May be ignored if a custom
ThreadContext map is specified.)
# Default: false
disableThreadContextMap=true
# Fully specified class name of a custom ThreadContextMap implementation class.
# log4j2.threadContextMap
# If true use a InheritableThreadLocal to implement the ThreadContext map.
Otherwise, use a plain ThreadLocal.
# (May be ignored if a custom ThreadContext map is specified.)
# isThreadContextMapInheritable=false
# Fully specified class name of a custom ContextDataInjector implementation
class.
# log4j2.ContextDataInjector
# Specify "true" to make the ThreadContext map garbage-free.
# Default: false
log4j2.garbagefree.threadContextMap=true
# If true, Log4j configuration objects like LoggerContexts, Appenders, Loggers,
etc.
# will not be instrumented with MBeans and cannot be remotely monitored and
managed.
# log4j2.disable.jmx=false
# If true, log4j's JMX notifications are sent from a separate background thread,
# otherwise they are sent from the caller thread. If system property
log4j2.is.webapp is true or the
# javax.servlet.Servlet class is on the classpath, the default behaviour is to
use the caller
# thread to send JMX notifications.
# Default: false
# log4j2.jmx.notify.async
# If true, the ConsoleAppender will not try to use the Jansi output stream on
Windows.
# Default: false
# log4j.skipJansi
# If true, classes are only loaded with the default class loader.
# Otherwise, an attempt is made to load classes with the current thread's
context class loader
# before falling back to the default class loader.
# Default: false
# log4j.ignoreTCL
# System property that may be used to seed the UUID generation with an integer
value.
# Default: 0
# org.apache.logging.log4j.uuidSequence
# If true, the full ThreadContext map is included in each SimpleLogger log
message.
# Default: false
# org.apache.logging.log4j.simplelog.showContextMap
# If true, the logger name is included in each SimpleLogger log message.
# Default: false
# org.apache.logging.log4j.simplelog.showlogname
# If true, only the last component of a logger name is included in SimpleLogger
log messages.
# (E.g., if the logger name is "mycompany.myproject.mycomponent", only
"mycomponent" is logged.
# Default: true
# org.apache.logging.log4j.simplelog.showShortLogname
# If true, SimpleLogger log messages contain timestamp information.
# Default: false
# org.apache.logging.log4j.simplelog.showdatetime
# Date-time format to use. Ignored if
org.apache.logging.log4j.simplelog.showdatetime is false.
# Default: "yyyy/MM/dd HH:mm:ss:SSS zzz"
# org.apache.logging.log4j.simplelog.dateTimeFormat
# "system.err" (case-insensitive) logs to System.err, "system.out"
(case-insensitive) logs to System.out,
# any other value is interpreted as a file name to save SimpleLogger messages
to.
# Default: system.err
# org.apache.logging.logj.simplelog.logFile
# Default level for new SimpleLogger instances.
# Default: ERROR
# org.apache.logging.log4j.simplelog.level
# Log level for a the SimpleLogger instance with the specified name.
# Default: SimpleLogger default log level
# org.apache.logging.log4j.simplelog.<loggerName>level
# This property is used to control the initial StatusLogger level, and can be
overridden in code by calling
# StatusLogger.getLogger().setLevel(someLevel). Note that the StatusLogger
level is only used to determine the status
# log output level until a listener is registered. In practice, a listener is
registered when a configuration is found,
# and from that point onwards, status messages are only sent to the listeners
(depending on their statusLevel).
# Default: ERROR
# org.apache.logging.log4j.simplelog.StatusLogger.level
# The StatusLogger logs events that occur in the logging system to the console.
During configuration,
# AbstractConfiguration registers a StatusConsoleListener with the StatusLogger
that may redirect status log events
# from the default console output to a file. The listener also supports
fine-grained filtering. This system property
# specifies the default status log level for the listener to use if the
configuration does not specify a status level.
#
# Note: this property is used by the log4j-core implementation only after a
configuration file has been found.
# Default: ERROR
# Log4jDefaultStatusLevel
# The initial "listenersLevel" of the StatusLogger. If StatusLogger listeners
are added, the "listenerLevel" is changed
# to that of the most verbose listener. If any listeners are registered, the
listenerLevel is used to quickly determine
# if an interested listener exists.
#
# By default, StatusLogger listeners are added when a configuration is found
and by the JMX StatusLoggerAdmin MBean.
# For example, if a configuration contains <Configuration status="trace">, a
listener with statusLevel TRACE is
# registered and the StatusLogger listenerLevel is set to TRACE, resulting in
verbose status messages displayed on
# the console.
#
# If no listeners are registered, the listenersLevel is not used, and the
StatusLogger output level is determined by
# StatusLogger.getLogger().getLevel() (see property
org.apache.logging.log4j.simplelog .StatusLogger.level).
# Default: WARN
# log4j2.StatusLogger.level
# Number of StatusLogger events that are kept in a buffer and can be retrieved
with StatusLogger.getStatusData().
# Default: 200
# og4j2.status.entries
# Fully qualified name of a class that implements the
com.lmax.disruptor.ExceptionHandler interface. The class needs to
# have a public zero-argument constructor. If specified, this class will be
notified when an exception occurs while
# logging the messages.
# If not specified, the default exception handler will print a message and
stack trace to the standard error output stream.
# Default: default handler
# AsyncLogger.ExceptionHandler
# Size (number of slots) in the RingBuffer used by the asynchronous logging
subsystem. Make this value large enough to
# deal with bursts of activity. The minimum size is 128. The RingBuffer will be
pre-allocated at first use and will
# never grow or shrink during the life of the system.
# Default: 256 * 1024
# AsyncLogger.RingBufferSize
# Valid values: Block, Timeout, Sleep, Yield.
# Block is a strategy that uses a lock and condition variable for the I/O
thread waiting for log events. Block can be
# used when throughput and low-latency are not as important as CPU resource.
Recommended for resource
# constrained/virtualised environments.
#
# Timeout is a variation of the Block strategy that will periodically wake up
from the lock condition await() call.
# This ensures that if a notification is missed somehow the consumer thread is
not stuck but will recover with a small
# latency delay (default 10ms).
#
# Sleep is a strategy that initially spins, then uses a Thread.yield(), and
eventually parks for the minimum number of
# nanos the OS and JVM will allow while the I/O thread is waiting for log
events. Sleep is a good compromise between
# performance and CPU resource. This strategy has very low impact on the
application thread, in exchange for some
# additional latency for actually getting the message logged.
#
# Yield is a strategy that uses a Thread.yield() for waiting for log events
after an initially spinning. Yield is a
# good compromise between performance and CPU resource, but may use more CPU
than Sleep in order to get the message
# logged to disk sooner.
#
# Default: Timeout
AsyncLogger.WaitStrategy=Sleep
# Valid values: CACHED, UNCACHED.
# By default, AsyncLogger caches the thread name in a ThreadLocal variable to
improve performance. Specify the UNCACHED
# option if your application modifies the thread name at runtime (with
Thread.currentThread().setName()) and you want
# to see the new thread name reflected in the log.
#
# Note: CACHED turns mSeries logs into mess as dispatcher sets thread name to
dispatchId when running task
# Default: CACHED
AsyncLogger.ThreadNameStrategy=UNCACHED
# Fully qualified name of a class that implements the
com.lmax.disruptor.ExceptionHandler interface. The class needs to
# have a public zero-argument constructor. If specified, this class will be
notified when an exception occurs while
# logging the messages. If not specified, the default exception handler will
print a message and stack trace to the
# standard error output stream.
# Default: default handler
# AsyncLoggerConfig.ExceptionHandler
# Size (number of slots) in the RingBuffer used by the asynchronous logging
subsystem. Make this value large enough to
# deal with bursts of activity. The minimum size is 128. The RingBuffer will be
pre-allocated at first use and will
# never grow or shrink during the life of the system.
# Default: 256 * 1024
# AsyncLoggerConfig.RingBufferSize
# Valid values: Block, Timeout, Sleep, Yield.
# Block is a strategy that uses a lock and condition variable for the I/O
thread waiting for log events. Block can be
# used when throughput and low-latency are not as important as CPU resource.
Recommended for resource
# constrained/virtualised environments.
#
# Timeout is a variation of the Block strategy that will periodically wake up
from the lock condition await() call.
# This ensures that if a notification is missed somehow the consumer thread is
not stuck but will recover with a small
# latency delay (default 10ms).
#
# Sleep is a strategy that initially spins, then uses a Thread.yield(), and
eventually parks for the minimum number of
# nanos the OS and JVM will allow while the I/O thread is waiting for log
events. Sleep is a good compromise between
# performance and CPU resource. This strategy has very low impact on the
application thread, in exchange for some
# additional latency for actually getting the message logged.
#
# Yield is a strategy that uses a Thread.yield() for waiting for log events
after an initially spinning. Yield is a
# good compromise between performance and CPU resource, but may use more CPU
than Sleep in order to get the message
# logged to disk sooner.
#
# Default: Timeout
AsyncLoggerConfig.WaitStrategy=Sleep
# Default LoggerAdapter to use in the JUL adapter. By default, if log4j-core is
available, then the class
# org.apache.logging.log4j.jul .CoreLoggerAdapter will be used. Otherwise, the
ApiLogggerAdapter will be used.
# Custom implementations must provide a public default constructor.
# Default: org.apache.logging.log4j.jul.ApiLoggerAdapter
# log4j.jul.LoggerAdapter
# If false (the default), Log4j will make sure the message is formatted in the
caller thread, to ensure the value at
# the time of the call to the logger is the value that is logged.
# Default: false
# log4j.format.msg.async
# Used by Async Loggers and the AsyncAppender to maintain application
throughput even when the underlying appender
# cannot keep up with the logging rate and the queue is filling up.
#
# If no value is specified (the default) events are never discarded. If the
queue is full, the logger call blocks until
# the event can be added to the queue.
#
# Specify Discard to drop events whose level is equal or less than the
threshold level (INFO by default) when the
# queue is full.
log4j2.AsyncQueueFullPolicy=Discard
# Used by the DiscardingAsyncQueueFullPolicy to determine which events to drop
when the queue becomes full. By default,
# INFO, DEBUG and TRACE level events are discarded when the queue is full. This
property only has effect if Discard is
# specified as the log4j2.AsyncQueueFullPolicy.
# Default: INFO
log4j2.DiscardThreshold=DEBUG
# Default message factory used by Loggers if no factory was specified.
# Default: org.apache.logging.log4j.message.ParameterizedMessageFactory or
org.apache.logging.log4j.message.ReusableMessageFactory in garbage-free mode
# log4j2.messageFactory
# Default flow message factory used by Loggers.
# Default: org.apache.logging.log4j.message.DefaultFlowMessageFactory
# log4j2.flowMessageFactory
# This system property can be used to force Log4j 2 to behave as if it is part
of a web application (when true) or as
# if it is not part of a web application (when false).
# Default: true if Servlet class on class path
log4j2.is.webapp=false
# This system property can be used to switch off the use of threadlocals, which
will partly disable Log4j's
# garbage-free behaviour: to be fully garbage-free, Log4j stores objects in
ThreadLocal fields to reuse them, otherwise
# new objects are created for each log event. Note that this property is not
effective when Log4j detects it is running
# in a web application.
# Default: true
# log4j2.enable.threadlocals
# This property can be used to force garbage-aware Layouts and Appenders to
revert to the pre-2.6 behaviour where
# converting log events to text generates temporary objects like Strings and
char[] arrays, and converting this text to
# bytes generates temporary byte[] arrays. By default, this property is true
and garbage-aware Layouts and Appenders
# that convert log events to text will convert this text to bytes without
creating temporary objects.
# Default: true
# log4j2.enable.direct.encoders
# In GC-free mode, this property determines the initial size of the reusable
StringBuilders where the message text is
# formatted and potentially passed to background threads.
# Default: 128
log4j.initialReusableMsgSize=512
# In GC-free mode, this property determines the maximum size of the reusable
StringBuilders where the message text is
# formatted and potentially passed to background threads.
# Default: 518
log4j.maxReusableMsgSize=2048
# This property determines the maximum size of the thread-local reusable
StringBuilders used to format the log event to
# text by Layouts that extend AbstractStringLayout.
# Default: 2048
log4j.layoutStringBuilder.maxSize=4096
# The org.apache.logging.log4j.util.Unbox utility manages a small thread-local
ring buffer of StringBuilders. Each time
# one of the box() methods is called, the next slot in the ring buffer is used,
until the ring buffer is full and the
# first slot is reused. By default the Unbox ring buffer has 32 slots, so user
code can have up to 32 boxed primitives
# in a single logger call.
# If more slots are required, set system property log4j.unbox.ringbuffer.size
to the desired ring buffer size.
# Note that the specified number will be rounded up to the nearest power of 2.
# Default: 32
# log4j.unbox.ringbuffer.size
# Prints a stacktrace to the status logger at DEBUG level when the
LoggerContext is started. For debug purposes.
# Default: false
# log4j.LoggerContext.stacktrace.on.start
{code}
> NullPointerException from AsyncLogger
> -------------------------------------
>
> Key: LOG4J2-2816
> URL: https://issues.apache.org/jira/browse/LOG4J2-2816
> Project: Log4j 2
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.13.0
> Reporter: Denis
> Priority: Minor
>
> We've got several times following NullPointerException (example from our
> stdout.log):
>
> {code:java}
> 84449.232: [purging class loader data graph, 0.0000003 secs]
> AsyncLogger error handling event seq=1037012,
> value='org.apache.logging.log4j.core.async.RingBufferLogEvent@2a7b2d78':
> java.lang.NullPointerException: null
> java.lang.NullPointerException
> at
> org.apache.logging.log4j.core.async.RingBufferLogEvent.execute(RingBufferLogEvent.java:161)
> at
> org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:46)
> at
> org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:29)
> at
> com.lmax.disruptor.BatchEventProcessor.processEvents(BatchEventProcessor.java:168)
> at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:125)
> at java.lang.Thread.run(Thread.java:748)
> AsyncLogger error handling event seq=1037022,
> value='org.apache.logging.log4j.core.async.RingBufferLogEvent@d5d330f':
> java.lang.NullPointerException: null
> java.lang.NullPointerException
> at
> org.apache.logging.log4j.core.async.RingBufferLogEvent.execute(RingBufferLogEvent.java:161)
> at
> org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:46)
> at
> org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:29)
> at
> com.lmax.disruptor.BatchEventProcessor.processEvents(BatchEventProcessor.java:168)
> at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:125)
> at java.lang.Thread.run(Thread.java:748)
> 84450.232: [deflating idle monitors, 0.0000624 secs]
> {code}
>
> What is interesting this NPEs always preceeded by
> {code}
> 84449.232: [purging class loader data graph, 0.0000003 secs] vm message
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)