我有一个带有 log4j 的 Struts 应用程序来显示有关应用程序的信息。
格式化日志输出的模式如下:
log4j.appender.RALL.layout.ConversionPattern=[%p] %d{dd/MM/yyyy HH:mm:ss} [THREAD ID=%t] [CLASS=(%C{1}:%L)] %m%n
我需要在日志中显示 线程 ID 而不是 线程名称。显示线程名称的转换字符是%t。我没有在 log4j 文档中看到获取它的方法。
谁能帮我??
原文由 Alejandro Cuervo 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是可能的,但并不像使用一些预配置的模式那么容易。
Log4j 1.X 和 Log4j 2.x 没有任何用于打印线程 ID 的预配置模式,但您始终可以使用一些“魔术”。
PatternLayout
is usingPatternParser
class which is mark asfinal
class and has static map of “patterns” as keys andConverters
classes as values .每次当 Parses 发现用于记录模式格式的模式以%
开头时,它都会使用与映射中此模式键匹配的转换器。您不能将自己的规则添加到该地图,但您仍然可以编写自己的 MyOwnPatternLayout:
这将在它的
format
方法中做这样的技巧:唯一的问题是您必须以某种方式获得该线程 ID。有时您所要做的就是解析您可以轻松收集的线程名称:
例如 Apache-Tomcat 将线程 ID 放在线程名称 http-nio-/127.0.0.1-8084”-exec-41 的末尾。
为确保线程 ID 正确,您还可以创建自己的 LogginEvent 和 Logger(MyLoggingEvent 和 MyLogger)子类,并在 MyLogger 中创建 MyLoggingEvent 女巫也将线程 ID 作为参数,而不仅仅是线程名称。然后你可以很容易地在上面的代码中收集它。