6

我的log4j.xml包含:

<appender class="org.jboss.logging.appender.RollingFileAppender" name="rm">
  ...
  </layout>

我的日志文件显示了乱序的时间戳。我们可以根据时间戳显示吗?

2009-02-19 14:47:01,288 调试 [com.catalystwms.core.persistence.TransactionContext]  
2009-02-19 14:54:27,429 信息 [com.catalystwms.tms.services.background.purge.PurgeManager]  
2009-02-19 14:47:01,288 调试 [com.catalystwms.core.services.ServiceLocator]

请帮我。

谢谢,

4

5 回答 5

5

两个日志语句是否发生在不同的线程上。

(线程 1) 2009-02-19 14:54:27,429 信息 [com.catalystwms.tms.services.background.purge.PurgeManager]
(线程 2) 2009-02-19 14:47:01,288 调试 [com.catalystwms。 core.services.ServiceLocator

我相信日志语句 time 准确地给出了事件发生的时间,但只是因为线程 2 正在等待获取锁而被乱序写入。我相信将您的附加程序包装在 org.apache.log4j.AsyncAppender 应该可以解决问题。

于 2009-02-25T17:11:55.307 回答
2

日期格式旨在允许基于简单字符的排序对其进行正确排序。

sort server.log | more

编辑:这对于在现有日志文件上使用很有用(不适用于配置 log4j)。

于 2009-02-25T17:49:28.713 回答
1

您有两个不同的进程使用滚动附加程序记录到同一个日志文件。Log4j 不允许这样做。过去,我通过在日志文件中添加服务器名称来在集群 Web 应用程序中解决此问题:appname-server1.log并将appname-server2.log每个服务器配置为写入自己的日志。

这对于跟踪特定于一台机器配置与另一台机器配置的错误也很有用。

如果您有两个不同的应用程序通过根据正在执行的应用程序命名文件来写入同一个日志文件,上述所有方法也适用。

于 2009-02-25T18:45:45.537 回答
0

回应@andy:(
线程 1) 2009-02-19 14:54:27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager]
(线程 2) 2009-02-19 14:47:01,288调试 [com.catalystwms.core.services.ServiceLocator

我认为可能发生的是线程 2 在尝试写入时在 14:47:01,288 创建了一个 logRecord,它需要为 Logger 的附加程序列表获取锁,但是另一个线程有锁并且正忙于执行 IO 所以线程2等。线程 1 在 14:54:27,429 创建 logRecord,它尝试获取相同的锁并等待。当锁被释放时,操作系统将它交给线程 1 并打印。

如果这是真的,另一个大问题是性能问题。代码路径可能会阻塞记录 IO。

于 2009-02-25T19:05:25.347 回答
-1

在写入日志之前,您可能无法修复它。您可以尝试修改 log4J 以在每次写入后调用 .flush() ,但这会使您的代码变慢很多,@Chris Nava 的解决方案更合适。

于 2009-02-25T18:22:27.963 回答