[
https://issues.apache.org/jira/browse/LOG4J2-2178?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Remko Popma reassigned LOG4J2-2178:
-----------------------------------
Assignee: Remko Popma
> Log4j2 ThreadNameCachingStrategy CACHED vs UNCACHED alternative
> ---------------------------------------------------------------
>
> Key: LOG4J2-2178
> URL: https://issues.apache.org/jira/browse/LOG4J2-2178
> Project: Log4j 2
> Issue Type: Improvement
> Components: API, Core
> Reporter: Clint Weisbrod
> Assignee: Remko Popma
> Priority: Minor
>
> It came to my attention a few weeks ago that by default, log4j2 caches the
> thread name of the calling thread to reduce overhead each time a new LogEvent
> is created. Refer to ReusableLogEventFactory.createEvent() in the source
> code. This is the correct approach most of the time but of course, there are
> situations where a developer will give a thread a new name after this thread
> has made at least one logging call.
> At present, the only way that log4j2 will detect changes to a thread's name
> (and subsequently write this new thread name to its logs) is to make use of
> ThreadNameCachingStrategy.UNCACHED. When initializing log4j2 (before any
> logging events are created), the system property called
> "AsyncLogger.ThreadNameStrategy" is queried. If its value is "UNCACHED", this
> forces log4j2 to ask for the current thread's name (and thread priority) for
> EVERY call to ReusableLogEventFactory.createEvent() (every log event).
> I've read over performance comparisons between CACHED and UNCACHED thread
> name logging modes. There is definitely a difference and IMHO, this is quite
> sad. Most people (including myself) choose log4j2 as their logging platform
> specifically because it is much faster than the built-in Java solution found
> in java.util.logging.
> Unfortunately, the way CACHED vs UNCACHED is implemented, there is no way to
> change the behavior once a thread has made a call to log an event. This is
> because the value of the system property "AsyncLogger.ThreadNameStrategy" is
> also cached at startup. In other words, if you know you will be changing the
> name of a thread and you need that new name to appear in your logs, you're
> stuck using the UNCACHED mode for the lifetime of your application. And
> perhaps this point is moot but this mode applies to all threads in your
> application.
> Given all this, rather than impact all threads over application lifetime, can
> I suggest to the jog4j2 developers, the addition of a new method in
> org.apache.logging.log4j.Logger called something like
> refreshCachedThreadName()? In practice, this new method would be called by
> the application immediately after a thread's name has been changed by a call
> to Thread.setName(). This places the responsibility on the application
> developer to deal with the renamed thread at a cost of not incurring the
> additional overhead to read the thread's name and priority per log event.
> I really hope this suggestion can be incorporated. It would make an already
> great logging platform even greater.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)