当我们将日志添加到 java 类(使用 log4j)时,是否可以在该日志消息中添加线程 ID?这是不好的做法吗?我的想法是添加这个线程ID;一旦我们检查了多线程应用程序的日志文件,就很难使用日志找出正确的流程。(例如,说身份验证流程)。有没有比记录线程ID更好的方法?
4 回答
Log4j 已经支持在其模式布局t
中使用占位符的胎面名称。所以这是一个受支持的功能,如果你觉得它有用,你应该使用它。这种方式不需要手动传递线程名称。但是它不使用线程 ID。所以你应该给你的线程起有意义的名字。这应该是首选,因为它比简单的线程 ID 更能指示您的应用程序中正在发生的事情。
如果您使用 Java Logger API - LogRecord 有方法 getThreadID() 并且可以配置为记录。
对于 log4j,没有可用的 ThreadId 方法,并且记录它没有害处。如果您的类继承自 Thread,则可以使用方法 getName 和 setName 来命名每个线程。否则,您可以向 MyTask 添加一个名称字段,并在您的构造函数中对其进行初始化并使用更合理的线程名称而不是 ID。
Logback 有一个特殊的附加程序,称为SiftingAppender,它为您描述的问题类型提供了一个非常好的解决方案。SiftingAppender 可用于根据任何运行时属性(包括线程 ID)分离(或筛选)日志记录
如果您担心多个 JVM 写入同一个 FileAppender,那么我建议两件事:
- 使用 SLF4J 作为日志外观
- 在谨慎模式下使用 logback 作为日志记录实现
在谨慎模式下,FileAppender 将安全地写入指定
文件,即使存在运行在不同 JVM 中的其他 FileAppender 实例,也可能运行在不同主机上。
参考这个: http: //logback.qos.ch/manual/appenders.html#SiftingAppender