[
https://issues.apache.org/jira/browse/LOG4J2-416?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13796673#comment-13796673
]
Remko Popma commented on LOG4J2-416:
------------------------------------
Dimitry, glad to hear that.
Regarding locking, for some applications this may be a good idea.
However, I don't think it is possible to do this in a generic way in the
logging library.
Again, this is something that in my opinion should be done in the application.
The application knows which objects may be modified at the same time as they
are read, and the application knows best how to do any locking if necessary. Is
a java.util.concurrent.Lock required? Or the synchronized keyword? Synchronize
the whole object, or just some attribute of it? These are all questions that
only the application can answer.
It is probably best if the logging library does *not* try to do locking,
because chances are we would do it wrong. :-)
> 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: [email protected]
For additional commands, e-mail: [email protected]