当我们在java类中添加日志时(使用log4j),在日志消息中添加线程id是否合适?这是一个不好的做法吗?我的想法是添加这个线程id;一旦我们检查了一个多线程应用程序的日志文件,就很难使用日志找到正确的流。(举个例子,比如身份验证流)。有没有比记录线程id更好的方法?
ogsagwnx1#
Log4j已经支持在其pattern layout中使用t占位符的线程名称。因此,这是一个受支持的特性,如果您发现它有用,应该使用它。这样您就不需要手动传递线程名称。但是,它不使用线程ID。因此,您应该为您的线程给予有意义的名称。这应该是首选的,因为它比普通线程id更能指示应用程序中正在发生的事情。
t
ltskdhd12#
如果是线程id,请参考this answer但是如果你只需要线程名,你可以使用t模式配置,请参考here。
r8uurelv3#
如果您使用的是Java Logger API - LogRecord具有方法getThreadID(),并且可以配置为记录日志。对于log4j,没有可用的ThreadId方法,记录它也无妨。如果你的类继承自Thread,你可以使用getName和setName方法来命名每个线程。否则,你可以只在MyTask中添加一个名称字段,并在构造函数中初始化它。
qco9c6ql4#
Logback有一个名为SiftingAppender的特殊附加器,它为您描述的问题类型提供了一个非常好的解决方案。SiftingAppender可用于根据任何运行时属性(包括线程ID)来分离(或筛选)日志记录如果您关心的是几个JVM写入同一个FileAppender,那么我建议您做两件事:
在谨慎模式下,FileAppender将安全地写入指定的即使存在运行在不同JVM(可能运行在不同主机上)中的其他FileAppender示例。请参阅:http://logback.qos.ch/manual/appenders.html#SiftingAppender
4条答案
按热度按时间ogsagwnx1#
Log4j已经支持在其pattern layout中使用
t
占位符的线程名称。因此,这是一个受支持的特性,如果您发现它有用,应该使用它。这样您就不需要手动传递线程名称。但是,它不使用线程ID。因此,您应该为您的线程给予有意义的名称。这应该是首选的,因为它比普通线程id更能指示应用程序中正在发生的事情。ltskdhd12#
如果是线程id,请参考this answer
但是如果你只需要线程名,你可以使用
t
模式配置,请参考here。r8uurelv3#
如果您使用的是Java Logger API - LogRecord具有方法getThreadID(),并且可以配置为记录日志。
对于log4j,没有可用的ThreadId方法,记录它也无妨。如果你的类继承自Thread,你可以使用getName和setName方法来命名每个线程。否则,你可以只在MyTask中添加一个名称字段,并在构造函数中初始化它。
qco9c6ql4#
Logback有一个名为SiftingAppender的特殊附加器,它为您描述的问题类型提供了一个非常好的解决方案。SiftingAppender可用于根据任何运行时属性(包括线程ID)来分离(或筛选)日志记录
如果您关心的是几个JVM写入同一个FileAppender,那么我建议您做两件事:
在谨慎模式下,FileAppender将安全地写入指定的
即使存在运行在不同JVM(可能运行在不同主机上)中的其他FileAppender示例。
请参阅:http://logback.qos.ch/manual/appenders.html#SiftingAppender