[
https://issues.apache.org/jira/browse/LOG4J2-1988?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16102549#comment-16102549
]
Remko Popma commented on LOG4J2-1988:
-------------------------------------
Interestingly, a similar issue was reported recently with LOG4J2-1990.
The patch that Gary proposed for that ticket will also likely solve the problem
reported in this ticket. However, with Async Loggers this problem _should not
happen_...
Synchronizing on the Collection (any collection, not just maps), before
rendering it to text is probably the safe thing to do in the face of
applications that are not careful with their threads.
The problem reported here is likely a Log4j2 bug. More investigation needed.
> 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)