You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Carter Kozak (Jira)" <ji...@apache.org> on 2021/01/29 15:44:00 UTC
[jira] [Commented] (LOG4J2-3009) Change of java Thread name is not
reflecting in log4j2 logs (pattern %t)
[ https://issues.apache.org/jira/browse/LOG4J2-3009?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17274527#comment-17274527 ]
Carter Kozak commented on LOG4J2-3009:
--------------------------------------
Hi [~Rohan438], Could you share the precise JVM version you're using? Log4j attempts to cache the thread name in environments (java 7 and some older java 8 releases) where garbage is created withing `thread.getName()`.
See this code for details: https://github.com/apache/logging-log4j2/blob/9fabec5277f06f59ceaeff20da055ab7bf1952c4/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java#L69-L85
It's very possible the detection logic is incorrect on some builds of java8, if you could provide the value of {{System.getProperty("java.version")}} I'd appreciate it!
The {{log4j2.asyncLoggerThreadNameStrategy}} may be set to {{UNCACHED}} to override this default on all systems. It may be set in a log4j2.component.properties file, or via a jvm system property.
It's a tad odd that these are described as properties for async logging, in reality they're more closely associated with gc-logging, and don't really relate to asynchronous features. Likely a historical artifact.
Docs:
https://logging.apache.org/log4j/2.x/manual/configuration.html#SystemProperties
https://logging.apache.org/log4j/2.x/manual/async.html#SysPropsAllAsync
> Change of java Thread name is not reflecting in log4j2 logs (pattern %t)
> ------------------------------------------------------------------------
>
> Key: LOG4J2-3009
> URL: https://issues.apache.org/jira/browse/LOG4J2-3009
> Project: Log4j 2
> Issue Type: Bug
> Components: Core, Pattern Converters
> Affects Versions: 2.8.2
> Reporter: Rohan Ramchander
> Priority: Major
> Original Estimate: 336h
> Remaining Estimate: 336h
>
> I have Java based application with a single thread connected to JBOSS MQ. Whenever there is a message in the queue then it pulls the message and sets the thread name with one of the message's attribute (REQUEST_ID) and continues processing. After application startup, the logging is fine for the first message. But from the second message, the change in the thread name is not reflecting in the logs.
> h2. Example code
> {code:java}
> private static Logger logger = LogManager.getLogger(EngineManager.class.getName());
> private synchronized void onMessage(javax.jms.Message msg) {
> Thread.currentThread().setName(msg.getStringProperty("REQUEST_ID"));
> logger.info("Received a Message Event: Time spent:" + (System.currentTimeMillis()-msg.getJMSTimestamp()) + "ms");
> // ...
> }
> {code}
> h2. Configuration
> {code:java}
> appender.console.layout.pattern = %d\{ABSOLUTE} %c{1} [%t] - %m%n
> {code}
> h2. Output
> {code:java}
> 19:29:52,726 EngineManager [sddsdsdgdd-dfvdddbfvs-2343412] - Received a Message Event: Time spent: 44ms
> {code}
>
> Rest everything is fine that's why I have given small portion of the code. What I need is when there is a second message (so on) in the queue then above REQUEST_ID should change in the logs. It is always same for all the messages. I tried different ways like {{LoggerContext.reconfigure()}}, {{LogManager.shutdown()}} and then {{getLogger()}} etc but couldn't succeed.
> This used to work fine with log4j 1x where the change in the thread name immediately reflects in the logs.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)