[ 
https://issues.apache.org/jira/browse/LOG4J2-416?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13793674#comment-13793674
 ] 

Remko Popma commented on LOG4J2-416:
------------------------------------

I've thought about it some more. The ParameterizedMessage is trying to make a 
copy of any object it is given by calling its toString() method. If it is not 
possible to reliably call the toString() method without causing an exception, 
is this the fault of the logging library?

Dimitry, I think you may have found a bug in your application: if you have 
multiple threads updating the same map you should probably be using a 
ConcurrentHashMap instead of a java.util.HashMap. It is a good thing the 
ConcurrentModificationExceptions gave a warning signal: other data structures 
would have just silently given you corrupted data... You may want to verify if 
any other data structures that are accessed from multiple threads are 
thread-safe. 

> ConcurrentModificationException when logging maps that are being worked on
> --------------------------------------------------------------------------
>
>                 Key: LOG4J2-416
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-416
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: API
>    Affects Versions: 2.0-beta9
>            Reporter: Dimitry Declercq
>
> We run a multi-thread application which logs Maps, after log.debug(map) we 
> continue to add items to the map, resulting in a 
> ConcurrentModificationException on the logging side.
> e.g
> thread1 adds 4 items to the map
> thread1 logs the map 
> thread2 receives map and adds 2 extra items
> thread2 logs the map as well (not needed to trigger this issue)
> The logging of the map in thread 1 will sometimes fail with a 
> ConcurrentModificationException.
> This is solved by logging a copy instead of the working variable, but I think 
> it would be good if Log4J does this out of the box
> Stacktrace:
> Exception in thread "Thread-38" java.util.ConcurrentModificationException
>         at java.util.HashMap$HashIterator.nextEntry(HashMap.java:894)
>         at java.util.HashMap$EntryIterator.next(HashMap.java:934)
>         at java.util.HashMap$EntryIterator.next(HashMap.java:932)
>         at 
> org.apache.logging.log4j.message.ParameterizedMessage.recursiveDeepToString(ParameterizedMessage.java:463)
>         at 
> org.apache.logging.log4j.message.ParameterizedMessage.deepToString(ParameterizedMessage.java:378)
>         at 
> org.apache.logging.log4j.message.ParameterizedMessage.parseArguments(ParameterizedMessage.java:164)
>         at 
> org.apache.logging.log4j.message.ParameterizedMessage.<init>(ParameterizedMessage.java:117)
>         at 
> org.apache.logging.log4j.message.ParameterizedMessage.<init>(ParameterizedMessage.java:126)
>         at org.slf4j.impl.SLF4JLogger.debug(SLF4JLogger.java:145)
>         at 
> com.lynx.api.rest.service.PriceResource.getPrice(PriceResource.java:74)
>         at 
> com.lynx.api.rest.service.PriceResourceTest$1.run(PriceResourceTest.java:166)
>         at java.lang.Thread.run(Thread.java:722)



--
This message was sent by Atlassian JIRA
(v6.1#6144)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-dev-h...@logging.apache.org

Reply via email to