是否可以使用线程 ID 在 java 类中执行日志



当我们向java类添加日志(使用log4j)时,是否可以在该日志消息中添加线程ID? 这是一种不好的做法吗?我的想法是添加这个线程 ID;一旦我们检查了多线程应用程序的日志文件,就很难使用日志找出正确的流。(例如,例如身份验证流)。除了记录线程 ID 之外,有没有更好的方法?

Log4j 已经支持在其模式布局中使用t占位符的线程名称。因此,这是一项受支持的功能,如果您发现它有用,则应使用它。这样,您无需手动传递线程名称。但是,它不使用线程 ID。因此,您应该为线程指定有意义的名称。这应该是首选,因为它比普通线程 ID 更能指示应用程序中正在发生的事情。

如果是线程 ID,请参考这个答案

但是如果你只需要线程名称,你可以使用t模式配置,请参考这里。

如果您使用的是 Java Logger API - LogRecord 具有方法 getThreadID(),可以配置为记录。

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

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

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

  • 使用 SLF4J 作为日志记录外观
  • 在谨慎模式下使用日志作为日志记录实现

在谨慎模式下,文件追加器将安全地写入指定的
文件,即使存在在 中运行的其他 FileAppender 实例 不同的 JVM,可能在不同的主机上运行。

参考这个: http://logback.qos.ch/manual/appenders.html#SiftingAppender

最新更新