Uploaded image for project: 'Log4j 2'
  1. Log4j 2
  2. LOG4J2-2158

ThreadContext map is cleared => entries are only available for one log event

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical
    • Resolution: Fixed
    • Affects Version/s: 2.10.0
    • Fix Version/s: 2.11.0
    • Component/s: None
    • Labels:
      None

      Description

      In org.apache.logging.log4j.core.impl.ThreadContextDataInjector.ForCopyOnWriteThreadContextMap.injectContextData without properties set, the result of ThreadContext.getThreadContextMap().getReadOnlyContextData() is returned which was saved in a variable called immutableCopy.

      org.apache.logging.log4j.core.impl.ReusableLogEventFactory.createEvent calls result.clear() on that context data when the next log event is created.

      Unfortunately the "immutable" copy is not immutable at all, but is cleared on the this call and all thread context map entries are lost.

      If I set a Property on all loggers in the config, then the thread context map entries are not cleared, because the internal string map is not given out but the entries copied, but that property is also logged then of course.

      If I instead set the system property log4j2.garbagefree.threadContextMap, the thread context map entries are also not cleared, as then also the entries are copied and not the internal structure given out.

      From what I have seen, I'd say there is a immutableCopy.freeze() missing before the immutableCopy is returned inside the if-block.

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                remkop@yahoo.com Remko Popma
                Reporter:
                vampire Björn Kautler
              • Votes:
                0 Vote for this issue
                Watchers:
                7 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: