2017-04-14 149 views
2

我需要在我的log4js日誌中包含PID。我看到很多使用線程上下文的例子。但是,這些需要在創建的每個單獨的線程上進行設置。我受到這樣的限制。在不使用線程上下文的情況下記錄log4j2中的PID

我需要一個解決方案,既不使用線程上下文,也可以爲任何可能創建的線程設置所有線程上下文的PID。

+0

我們已經爲此添加了功能請求:https://issues.apache.org/jira/browse/LOG4J2-1884 – Matt

回答

2

請在Log4j2 issue tracker上創建功能請求,以使其成爲內置功能。

現在,您可以創建一個自定義插件。見下面的代碼。這將允許您在pattern layout中指定%pid(與消息的%m類似)。

import org.apache.logging.log4j.core.LogEvent; 
import org.apache.logging.log4j.core.config.plugins.Plugin; 

@Plugin(name = "ProcessIdPatternConverter", category = "Converter") 
@ConverterKeys({ "pid", "processId" }) 
public final class ProcessIdPatternConverter extends LogEventPatternConverter { 
    private final String pid; 

    private ProcessIdPatternConverter(String[] options) { 
     super("Process ID", "pid"); 
     String temp = options.length > 0 ? options[0] : "???"; 
     try { 
      // likely works on most platforms 
      temp = ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; 
     } catch (final Exception ex) { 
      try { 
       // try a Linux-specific way 
       temp = new File("/proc/self").getCanonicalFile().getName(); 
      } catch (final IOException ignoredUseDefault) {} 
     } 
     pid = temp; 
    } 

    /** 
    * Obtains an instance of ProcessIdPatternConverter. 
    * 
    * @param options users may specify a default like {@code %pid{NOPID} } 
    * @return instance of ProcessIdPatternConverter. 
    */ 
    public static ProcessIdPatternConverter newInstance(final String[] options) { 
     return new ProcessIdPatternConverter(options); 
    } 

    @Override 
    public void format(final LogEvent event, final StringBuilder toAppendTo) { 
     toAppendTo.append(pid); 
    } 
} 

查看manual瞭解更多關於Log4j2插件如何工作的細節。讓Log4j2認識你的插件

一種方式是在配置的packages屬性指定插件類的包名稱:(跟蹤上Log4j2內部調試以幫助排除故障切換)

<Configuration status="trace" 
    packages="com.myorg.mypluginpackage"> 

+0

這是否適合您? –

+0

是的,但是請編輯答案以包含有關將新類的包添加到log4j2.xml配置的信息? – ds390s

+0

非常感謝。接受和upvoted – ds390s

相關問題