<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Liferay clears ThreadContext's MDC parameter map</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=122416581" />
  <subtitle>Liferay clears ThreadContext's MDC parameter map</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=122416581</id>
  <updated>2026-04-05T14:14:07Z</updated>
  <dc:date>2026-04-05T14:14:07Z</dc:date>
  <entry>
    <title>RE: Liferay clears ThreadContext's MDC parameter map</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=122427839" />
    <author>
      <name>Jamie Sammons</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=122427839</id>
    <updated>2024-02-26T21:49:15Z</updated>
    <published>2024-02-26T21:49:14Z</published>
    <summary type="html">&lt;p&gt;Bug Report Created: https://liferay.atlassian.net/browse/LPD-18800&lt;/p&gt;</summary>
    <dc:creator>Jamie Sammons</dc:creator>
    <dc:date>2024-02-26T21:49:14Z</dc:date>
  </entry>
  <entry>
    <title>Liferay clears ThreadContext's MDC parameter map</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=122416580" />
    <author>
      <name>Mikael Andersson</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=122416580</id>
    <updated>2024-02-23T17:50:40Z</updated>
    <published>2024-02-21T14:24:13Z</published>
    <summary type="html">&lt;p&gt;It looks like a logger from Liferay's LogFactory clears
  ThreadContext's parameter map after first log write. Apache's log4j2
  logger does not clear the parameter map. This causes problems if/when
  I use MDC logging and expect my MDC parameters stay in TheadContext's
  parameter map for many log writes, until I decide to remove them.&lt;/p&gt;
&lt;p&gt;My log4j2 pattern:&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-java"&gt;%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t][%c{1}:%L] NDC = [%x] MDC all = [%X] MDC email = [%X{email}] %m%n&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And my test code:&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-java"&gt;Logger log4jLogger = LogManager.getLogger(LogTestPortlet.class);
Log liferayLogger = LogFactoryUtil.getLog(LogTestPortlet.class);

ThreadContext.put(&amp;quot;email&amp;quot;, &amp;quot;dummy@test.my&amp;quot;);
        
log4jLogger.info(&amp;quot;log4jlogger 1&amp;quot;);
log4jLogger.info(&amp;quot;log4jlogger 2&amp;quot;);
liferayLogger.info(&amp;quot;liferayLogger 1&amp;quot;);
liferayLogger.info(&amp;quot;liferayLogger 2&amp;quot;);
log4jLogger.info(&amp;quot;log4jlogger 3&amp;quot;);

ThreadContext.remove(&amp;quot;email&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And Liferay log:&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-java"&gt;2024-02-21 13:51:25.116 INFO  MDC all = [{email=dummy@test.my}] MDC email = [dummy@test.my] log4jlogger 1
2024-02-21 13:51:25.117 INFO  MDC all = [{email=dummy@test.my}] MDC email = [dummy@test.my] log4jlogger 2
2024-02-21 13:51:25.118 INFO  MDC all = [{email=dummy@test.my}] MDC email = [dummy@test.my] liferayLogger 1
2024-02-21 13:51:25.119 INFO  MDC all = [{}] MDC email = [] liferayLogger 2
2024-02-21 13:51:25.120 INFO  MDC all = [{}] MDC email = [] log4jlogger 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This example simulates a scenario where Liferay writes to log during
  my processing (for example if a call a Liferay function in my code).&lt;/p&gt;
&lt;p&gt;I beleive this is caused by LPS-155004 Cleaning the ThreadContext for
  log4j after usage to avoid mixing up with other classes.&lt;br&gt;
  &lt;a href="https://github.com/liferay/liferay-portal/commit/4a6fe4797f2d86b0fa9a65ad16562083ac26c0fe"&gt;https://github.com/liferay/liferay-portal/commit/4a6fe4797f2d86b0fa9a65ad16562083ac26c0fe&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;IMO it would be good if _cleanThreadContext() would remove only those
  parameters from ThreadContext that were added in
  _populateThreadContext(). As said, currently also possible non-Liferay
  parameters are removed from ThreadContext.&lt;/p&gt;
&lt;p&gt;My test environment: Docker version of Liferay 7.4.3.106-ga106.&lt;/p&gt;</summary>
    <dc:creator>Mikael Andersson</dc:creator>
    <dc:date>2024-02-21T14:24:13Z</dc:date>
  </entry>
</feed>
