Clint Weisbrod created LOG4J2-2178:
--------------------------------------

             Summary: 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
            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)

Reply via email to