這可能但並不簡單,只是使用一些預配置的模式。
Log4j 1.X和Log4j 2.x沒有用於打印線程ID的任何預配置模式,但您始終可以使用一些「魔術技巧」。
PatternLayout
使用PatternParser
類,這是標記作爲final
類和具有「模式」作爲鍵和Converters
類作爲值的靜態映射。 Parse每次發現使用從%
開始的記錄模式格式的模式時,它將使用與該模式鍵匹配的轉換器映射。
你不能自己的規則添加到地圖,但你仍然可以編寫自己的MyOwnPatternLayout:
public class MyOwnPatternLayout extends PatternLayout
將在它的format
方法做這樣的把戲:
public String format(LoggingEvent event) {
String log = super.format(event);
/*
Now you just have to replace with regex all occurences of %i or
any mark you would like to use as mark to represent Thread ID
with Thread ID value.
Only thing you have to be sure to not use any mark as your Thread ID
that already is defined by PatterParser class
*/
return log.replaceAll("%i", someThreadID);
}
唯一的問題是你必須以某種方式獲得該線程ID。有時候,你所要做的就是解析線程名巫婆你能收集伊斯利:
String threadName = event.getThreadName();
例如Apache的Tomcat的把線程ID的線程名結束HTTP-nio-/127.0.0.1-8084" -exec-41。
要確保線程ID是正確的,你也可以讓自己的LogginEvent和記錄器(MyLoggingEvent和MyLogger)的子類,裏面MyLogger創建MyLoggingEvent魔女也將作爲參數線程ID不僅線程名。然後,您可以輕鬆地在上面的代碼中收集它。
對不起,我希望這至少會給你一些幫助。
你嘗試用'%i'? – partlov
是的,我試過了,但正如你在下面說的,它只適用於IBM服務器 –
@partlov這對我不起作用,'%i'無法識別,我正在使用log4j'1.2.16'。 –