在java类中使用线程id记录日志可以吗?
当我们将日志添加到java类中(使用log4j)时,是否可以使用该日志消息添加线程id?这是个坏习惯吗?我的想法是添加这个线程id;一旦我们检查了多线程应用程序的日志文件,就很难使用日志找到正确的流。(例如,假设身份验证流)。有没有比记录线程id更好的方法 Log4j已经支持在its中使用在java类中使用线程id记录日志可以吗?,java,logging,log4j,Java,Logging,Log4j,当我们将日志添加到java类中(使用log4j)时,是否可以使用该日志消息添加线程id?这是个坏习惯吗?我的想法是添加这个线程id;一旦我们检查了多线程应用程序的日志文件,就很难使用日志找到正确的流。(例如,假设身份验证流)。有没有比记录线程id更好的方法 Log4j已经支持在its中使用t占位符的胎面名称。因此,这是一个受支持的功能,如果您觉得有用,应该使用它。这种方式不需要手动传递线程名称。但是,它没有使用线程ID。因此,您应该为线程指定有意义的名称。这应该是首选,因为它比普通线程id更能指
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实例 不同的JVM,可能运行在不同的主机上
请参阅:在日志文件中包含线程id是相当常见的做法,对于一些多线程应用程序非常有用。我还将添加会话id(如果您的应用程序是基于web的)。