Log4j2记录空的ThreadContext

时间:2017-09-26 08:49:49

标签: java logging log4j log4j2

我有以下控制台appender;

<Console name="STDOUT">
     <PatternLayout pattern="%highlight{%d [%t] %notEmpty{[%marker] }%-5level: %msg %X%n%throwable}"/>
     <ThresholdFilter level="trace"/>
</Console>

问题是我在这里使用的模式输出一个空的ThreadContext({})。我不想使用特定的密钥名称(例如%X{username}),因为系统非常广泛且密钥集不同。示例输出:

  

2017-09-26 10:39:55,396 [main]信息:启动内部HTTP   客户{}

2 个答案:

答案 0 :(得分:1)

使用ScriptPatternSelector会要求log4j将“{}”替换为MDC的空字符串。为此,请在log4j.xml或log4j2.xml中将“%X”替换为“%equals {%X} {{}} {}”。

答案 1 :(得分:0)

好的,我通过使用ScriptPatternSelector解决了我的问题。下面的脚本检查logEvent的MDC是否为空,如果为true则更改模式;

<Console name="STDOUT">
      <PatternLayout>
         <ScriptPatternSelector defaultPattern="%highlight{%d [%t] %notEmpty{[%marker] }%-5level: %msg%n%throwable}">
               <Script name="MDCSelector" language="javascript"><![CDATA[
                    result = null;
                    if (!logEvent.getContextData().size() == 0) {
                        result = "WithMDC";
                    } else {
                        result = null;
                    }
                    result;
               ]]>
               </Script>
           <PatternMatch key="WithMDC" pattern="%highlight{%d [%t] %notEmpty{[%marker] }%-5level: %msg %X%n%throwable}"/>
         </ScriptPatternSelector>
     </PatternLayout>
    <ThresholdFilter level="trace"/>
</Console>