Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java类中使用线程id记录日志可以吗?_Java_Logging_Log4j - Fatal编程技术网

在java类中使用线程id记录日志可以吗?

在java类中使用线程id记录日志可以吗?,java,logging,log4j,Java,Logging,Log4j,当我们将日志添加到java类中(使用log4j)时,是否可以使用该日志消息添加线程id?这是个坏习惯吗?我的想法是添加这个线程id;一旦我们检查了多线程应用程序的日志文件,就很难使用日志找到正确的流。(例如,假设身份验证流)。有没有比记录线程id更好的方法 Log4j已经支持在its中使用t占位符的胎面名称。因此,这是一个受支持的功能,如果您觉得有用,应该使用它。这种方式不需要手动传递线程名称。但是,它没有使用线程ID。因此,您应该为线程指定有意义的名称。这应该是首选,因为它比普通线程id更能指

当我们将日志添加到java类中(使用log4j)时,是否可以使用该日志消息添加线程id?这是个坏习惯吗?我的想法是添加这个线程id;一旦我们检查了多线程应用程序的日志文件,就很难使用日志找到正确的流。(例如,假设身份验证流)。有没有比记录线程id更好的方法

Log4j已经支持在its中使用
t
占位符的胎面名称。因此,这是一个受支持的功能,如果您觉得有用,应该使用它。这种方式不需要手动传递线程名称。但是,它没有使用线程ID。因此,您应该为线程指定有意义的名称。这应该是首选,因为它比普通线程id更能指示应用程序中正在发生的事情。

如果它是线程id,请参考


但是,如果您只需要线程名称,则可以使用
t
模式配置,请参阅。

如果您使用的是Java Logger API,则LogRecord具有方法getThreadID(),并且可以配置为日志

对于log4j,没有可用的ThreadId方法,记录它也没有坏处。
如果类继承自线程,则可以使用方法getName和setName来命名每个线程。否则,您可以只在MyTask中添加一个名称字段,并在构造函数中初始化它,然后使用一个更合理的线程名称而不是ID。

Logback有一个名为SiftingAppender的特殊appender,它为您描述的问题类型提供了一个非常好的解决方案。SiftingAppender可用于根据任何运行时属性(包括线程id)分离(或筛选)日志记录

如果您关心的是多个JVM写入同一个FileAppender,那么我建议两件事:

  • 使用SLF4J作为日志外观
  • 在谨慎模式下,使用logback作为日志记录实现
在谨慎模式下,FileAppender将安全地写入指定的
文件,即使存在运行在中的其他FileAppender实例 不同的JVM,可能运行在不同的主机上


请参阅:

在日志文件中包含线程id是相当常见的做法,对于一些多线程应用程序非常有用。我还将添加会话id(如果您的应用程序是基于web的)。