[
https://issues.apache.org/jira/browse/LOG4J2-1988?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16104267#comment-16104267
]
Remko Popma commented on LOG4J2-1988:
-------------------------------------
I strongly suspect this is a bug in Log4j2 because the
ConcurrentModificationException occurs in the async logger's background thread.
Before we got here, during handoff to the background thread, the map parameter
should have been rendered to text (in the application thread). I just need to
figure out why this didn't happen.
> 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)