我有一个java应用程序。我正在使用日志格式化程序对象。所有日志消息都应具有此对象。例如
log.debug(new LogFormatter(x,y,z))
但我必须创建新的LogFormatter对象以及我要记录的所有内容。如果我使用静态方法,例如
log.debug(LogFormatter.format(x,y,z))
我不必创建新对象。但在多线程应用程序中它会正常工作。
如果两个线程使用diff值调用,那么日志记录就会搞乱。
或者是本地线程最好的方式
答案 0 :(得分:1)
这取决于记录器的实现。如果您将使用本机Java类,那么您应该使用方法的synchronize
关键字或处理日志插入的代码部分来处理锁。
IMO我建议使用像Log4J这样的线程安全的日志库:
请注意,某些Java应用程序服务器(如JBoss和GlassFish)使用Log4j来处理日志记录工作。
答案 1 :(得分:1)
我会用
private final LogFormatter logFormatter; // immutable object.
log.debug(logFormatter.format(x,y,z))
由于格式化程序是不可变的,因此可以共享。
答案 2 :(得分:0)
这取决于两件事:
LogFormatter.format(x,y,z)
方法是否是线程安全的。如果这两个条件都成立,那么您可以在多线程环境中使用您的方案,并且不会出现错误。
具体来说,您的记录器实现应该是线程安全的,因为它同步对底层输出机制的访问:例如,通过确保一次只打印一个日志记录。
答案 3 :(得分:0)
为了避免仅在启用日志记录时线程之间的同步,我习惯于为每个线程关联一个日志链。 难点是将几个文件连接到 - 离线 - 了解正在发生的事情。 每行日志都有一个日期和一个线程ID。