2017-09-26 154 views
0

我有以下控制檯appender;Log4j2日誌清空ThreadContext

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

的問題是,我在這裏使用的模式輸出空ThreadContext({})。我不想使用特定的密鑰名稱(例如%X{username}),因爲系統非常廣泛,密鑰集也各不相同。示例輸出:

2017年9月26日10:39:55396 [主要] INFO:啓動內部HTTP 客戶{}

回答

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>