[
https://issues.apache.org/jira/browse/LOG4J2-1988?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16099987#comment-16099987
]
Remko Popma commented on LOG4J2-1988:
-------------------------------------
It would be better if we can verify that the {{log4j.format.msg.async}}
property is really false in your system (perhaps by printing the value of
{{System.getProperties()}} from within your system). By the way, the Log4j2
status log will not help here because it does not report the value of this or
other system properties.
The exception happens because for some reason Log4j2 is not taking a snapshot
of the ParameterizedMessage before handing it over to the background thread,
and one of the parameters is a LinkedHashMap that is modified in the
application while being iterated over in the background thread.
The only reason I am aware of that Log4j2 would not take a snapshot of the
ParameterizedMessage is the above system property. If you can verify this
system property is false or is not defined then there must be a bug somewhere.
> java.util.ConcurrentModificationException with AsyncLogger?
> -----------------------------------------------------------
>
> Key: LOG4J2-1988
> URL: https://issues.apache.org/jira/browse/LOG4J2-1988
> Project: Log4j 2
> Issue Type: Question
> Components: Layouts
> Affects Versions: 2.8.2
> Environment: Java 1.8.0_111, Linux
> Reporter: Corneliu C
> Assignee: Remko Popma
> Priority: Minor
>
> Hi,
> I see java.util.ConcurrentModificationException even with AsyncLogger and I
> don't know if it's something I can configure to get rid of these exceptions.
> The application uses Apache Camel framework and there is a mixture of Async
> Appender and Async Logger defined.
> I don't see many of these but they happen from time to time; they are printed
> in the Console appender.
> * Stacktrace:
> {code}
> 2017-07-19 11:53:56,024 Log4j2-TF-11-AsyncLoggerConfig-4 ERROR An exception
> occurred processing Appender ApacheCamel
> java.util.ConcurrentModificationException
> at java.util.LinkedHashMap$LinkedHashIterator.nextNode(Unknown Source)
> at java.util.LinkedHashMap$LinkedEntryIterator.next(Unknown Source)
> at java.util.LinkedHashMap$LinkedEntryIterator.next(Unknown Source)
> at
> org.apache.logging.log4j.message.ParameterFormatter.appendMap(ParameterFormatter.java:569)
> at
> org.apache.logging.log4j.message.ParameterFormatter.appendPotentiallyRecursiveValue(ParameterFormatter.java:505)
> at
> org.apache.logging.log4j.message.ParameterFormatter.recursiveDeepToString(ParameterFormatter.java:432)
> at
> org.apache.logging.log4j.message.ParameterFormatter.formatMessage2(ParameterFormatter.java:189)
> at
> org.apache.logging.log4j.message.ParameterizedMessage.formatTo(ParameterizedMessage.java:225)
> at
> org.apache.logging.log4j.core.pattern.MessagePatternConverter.format(MessagePatternConverter.java:119)
> at
> org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:38)
> at
> org.apache.logging.log4j.core.layout.PatternLayout$PatternSerializer.toSerializable(PatternLayout.java:333)
> at
> org.apache.logging.log4j.core.layout.PatternLayout.toText(PatternLayout.java:232)
> at
> org.apache.logging.log4j.core.layout.PatternLayout.encode(PatternLayout.java:217)
> at
> org.apache.logging.log4j.core.layout.PatternLayout.encode(PatternLayout.java:57)
> at
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:177)
> at
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:170)
> at
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:161)
> at
> org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.append(RollingRandomAccessFileAppender.java:218)
> at
> org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:448)
> at
> org.apache.logging.log4j.core.async.AsyncLoggerConfig.asyncCallAppenders(AsyncLoggerConfig.java:115)
> at
> org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigDisruptor.java:112)
> at
> org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigDisruptor.java:98)
> at
> com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:129)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
> at java.lang.Thread.run(Unknown Source)
> {code}
> * Log4j.xml configuration:
> {code}
> <?xml version="1.0" encoding="UTF-8"?>
> <Configuration status="TRACE" name="Test" packages=""
> monitorInterval="10" dest="log4j2-console.log" verbose="false">
> <Properties>
> <Property name="instanceName">${hostName}-app</Property>
> </Properties>
> <Appenders>
> ...
> <Appenders>
> <AlertAppender name="Alert" />
> <EventAppender name="Event" />
> <Console name="Console" target="SYSTEM_OUT">
> <PatternLayout pattern="%d{COMPACT}{UTC} %-5p %t
> %C{1}:%l [%X{camel.breadcrumbId}] %m{nolookups}%n%ex{full}" />
> </Console>
> ...
> <RollingRandomAccessFile name="ApacheCamel"
> fileName="${instanceName}-apache-camel.log"
> filePattern="${instanceName}-apache-camel.log.%d{yyMMdd}-%i"
> immediateFlush="false">
> <PatternLayout>
> <Pattern>%d{COMPACT}{UTC} %-5p %t %c{1}
> [%X{camel.breadcrumbId}] %m{nolookups}%n%ex{full}</Pattern>
> </PatternLayout>
> <Policies>
> <TimeBasedTriggeringPolicy interval="1"
> modulate="true" />
> <SizeBasedTriggeringPolicy size="100 MB" />
> </Policies>
> <DefaultRolloverStrategy max="20"/>
> </RollingRandomAccessFile>
> ...
> <Loggers>
> <AsyncLogger name="org.apache.camel" level="TRACE"
> additivity="false"
> includeLocation="false">
> <AppenderRef ref="ApacheCamel" />
> </AsyncLogger>
> ...
> <Root level="INFO" includeLocation="false">
> <AppenderRef ref="Async" />
> </Root>
> </Loggers>
> </Configuration>
> {code}
> As environment parameters these are configured:
> {code}
> -Dlog4j2.disable.jmx=true -Dlog4j2.enable.threadlocals=true
> -Dlog4j2.enable.direct.encoders=true
> -Dlog4j2.garbagefree.threadContextMap=true
> -DAsyncLoggerConfig.RingBufferSize=10240
> {code}
> Following libs are in classpath:
> disruptor-3.3.6.jar
> log4j-api-2.8.2.jar
> log4j-core-2.8.2.jar
> log4j-jul-2.1.jar
> log4j-slf4j-impl-2.8.2.jar
> log4j-web-2.8.2.jar
> slf4j-api-1.7.21.jar
> Thank you
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)