这是可能的,但并不像仅使用一些预配置的模式那样容易。
Log4j 1.X和Log4j 2.x没有用于打印线程ID的任何预配置模式,但是您始终可以使用一些“魔术”。
PatternLayout正在使用
PatternParser标记为
final类的类,并且将“模式”的静态映射作为键并将
Converters类作为值。每当Parses从其开始以日志记录格式格式找到用于记录的格式时,
%都会使用与此映射键匹配的转换器。
您不能将自己的规则添加到该地图,但仍可以编写自己的MyOwnPatternLayout:
public class MyOwnPatternLayout extends PatternLayout
这将在它的
format方法中做到这一点:
public String format(LoggingEvent event) { String log = super.format(event); return log.replaceAll("%i", someThreadID);}唯一的问题是,您必须以某种方式获取该线程ID。有时您要做的就是解析线程名称,您可以轻松地收集它:
String threadName = event.getThreadName();
例如,Apache-Tomcat将线程ID放在线程名称 http-nio- / 127.0.0.1-8084“ -exec-41 的末尾。
为了确保线程ID正确,您还可以创建自己的LogginEvent和Logger子类(MyLoggingEvent和MyLogger),并在MyLogger内创建MyLoggingEvent巫婆还将线程ID不仅作为线程名作为参数。然后,您可以轻松地在上面的代码中收集它。
抱歉,我的回答很长,希望至少能对您有所帮助。



