1

我有一个java应用程序。我正在使用日志格式化程序对象。所有日志消息都应该有这个对象。例如

log.debug(new LogFormatter(x,y,z))

但是我必须创建新的 LogFormatter 对象,以及我想要记录的所有内容。例如,如果我使用静态方法

log.debug(LogFormatter.format(x,y,z))

比我不必创建新对象。但是在多线程应用程序中它是否可以正常工作。

如果两个线程使用 diff 值调用,那么日志记录会变得混乱。

或者线程本地是最好的方法

4

4 回答 4

1

这将取决于记录器的实现。如果您将使用本机 Java 类,那么您应该使用synchronize方法的关键字或处理日志插入的代码部分来处理锁。

IMO 我建议使用像 Log4J 这样的线程安全的日志库:

请注意,一些 Java 应用服务器(如 JBoss 和 GlassFish)使用 Log4j 来处理日志记录工作。

于 2012-10-12T14:39:33.320 回答
1

我会用

private final LogFormatter logFormatter; // immutable object.

log.debug(logFormatter.format(x,y,z))

由于格式化程序是不可变的,因此可以共享。

于 2012-10-12T14:40:22.190 回答
0

这取决于两件事:

  1. LogFormatter.format(x,y,z)方法是否是线程安全的。
  2. 您的记录器实现是否是线程安全的。

如果这两个条件为真,那么您可以在多线程环境中使用您的方案并且不会出现错误。

具体来说,您的记录器实现应该是线程安全的,因为它同步对底层输出机制的访问:例如,通过确保一次只打印一条日志记录。

于 2012-10-12T14:41:21.473 回答
0

为了避免仅在打开日志记录时线程之间的同步,我习惯于为每个线程关联一个日志链。困难在于加入几个文件以离线了解正在发生的事情。每行日志都有一个日期和一个线程 ID。

于 2012-10-12T14:51:18.410 回答