在日志中显示线程ID而不是线程名称

我有一个带有log4j的Struts应用程序,用于显示有关应用程序的信息。

格式化日志输出的模式如下:

log4j.appender.RALL.layout.ConversionPattern=[%p] %d{dd/MM/yyyy HH:mm:ss} [THREAD ID=%t] [CLASS=(%C{1}:%L)] %m%n

我需要在日志中显示 而不是 。显示线程名称的转换字符为%t。我没有在log4j文档中看到获得它的方法。

谁能帮我??

回答:

这是可能的,但并不像仅使用一些预配置的模式那样容易。

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);

/*

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放在线程名称 的末尾。

为了确保线程ID正确,您还可以创建自己的LogginEvent和Logger子类(MyLoggingEvent和MyLogger),并在MyLogger内创建MyLoggingEvent巫婆还将线程ID不仅作为线程名作为参数。然后,您可以轻松地在上面的代码中收集它。

抱歉,我的回答很长,希望至少能对您有所帮助。

以上是 在日志中显示线程ID而不是线程名称 的全部内容, 来源链接: utcz.com/qa/398746.html

回到顶部