这可能但并不简单,只是使用一些预配置的模式。
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'。 –