当前位置: 首页 > 面试题库 >

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

松嘉运
2023-03-14
问题内容

我有一个带有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文档中看到获得它的方法。

谁能帮我??


问题答案:

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

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放在线程名称 http-nio- / 127.0.0.1-8084“ -exec-41 的末尾。

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

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



 类似资料:
  • 问题内容: 在登录内部时,如何获取处理程序正在处理的http请求的或任何其他唯一ID ? 在Java中,当Tomcat或其他容器处理多个HTTP请求时,线程ID有助于跟踪相应HTTP请求处理的所有日志消息。 等价于什么?给定使用库开发的Rest API ,如何在处理程序处理中跟踪特定http请求的所有日志语句? 问题答案: 根据https://groups.google.com/forum/#!s

  • 问题内容: 我正在使用Go语言,回声框架进行开发。 我正在设计一个记录器,我想将线程ID的等价物记录到日志中,但是我不知道一个好的方法。 例如,如果同时进行多次访问的登录处理,则它在一侧成功,而在一侧失败。通过查看失败的日志无法确定。 经过检查,Go语言中的goroutine的id存在,但我不应该得到它,最初据说goroutine在同一线程中是不同的。 如何识别线程?还是有包装将它们放入日志中?

  • 问题内容: 我有一个Java应用程序,其中创建了一些线程(通过)。通过使用,我可以看到它们具有不同的线程ID(LWP列),我想从Java应用程序中获取这些ID。 在我发现的与此主题相关的大多数文章中,解决方案是使用。 但是,使用该方法可以为我提供主线程的PID(即使我从其中一个线程调用它),因此它并不能真正解决我的问题。 有什么方法可以获取应用程序创建的每个线程的线程ID ? 是否可以使用JNI完

  • 问题内容: 我想使用它的ID终止线程。 使用下面的语句我得到线程。我正在维护的该线程ID ,但是每当使用要终止该线程时,我就有可能使用线程ID终止。 我该如何实现? 问题答案: 你可以这样

  • 问题内容: 线程ID和线程句柄有什么区别?为什么两者都需要?Windows和Linux之间有区别吗? 问题答案: 据我所知,Linux的pthread库没有线程句柄的概念。pthread_create和其他pthreads函数,返回线程ID。 在Windows下,线程句柄不同于线程ID,就像文件句柄不同于文件名一样。 线程句柄是一个令牌,它使您可以对线程执行某些操作(通常等待或杀死它)。Win32