我的log4j.xml
包含:
<appender class="org.jboss.logging.appender.RollingFileAppender" name="rm">
...
</layout>
我的日志文件显示乱序的时间戳。我们可以根据时间戳显示吗?
2009-02-19 14:47:01,288 DEBUG [com.catalystwms.core.persistence.TransactionContext] 2009-02-19 14:54:27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager] 2009-02-19 14:47:01,288 DEBUG [com.catalystwms.core.services.ServiceLocator]
请帮帮我。
谢谢,
答案 0 :(得分:3)
两个日志语句是否在不同的线程上发生。
(主题1) 2009-02-19 14:54:27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager]
(主题2) 2009-02-19 14:47:01,288 DEBUG [com.catalystwms.core.services.ServiceLocator
我相信日志语句时间会给出事件发生的时间,但是由于线程2正在等待获取锁定而没有按顺序写入。我相信在org.apache.log4j.AsyncAppender中包装你的appender应该可以解决这个问题。
答案 1 :(得分:2)
日期格式旨在允许基于简单字符的排序正确排序。
sort server.log | more
编辑:这对现有日志文件(不是用于配置log4j)非常有用。
答案 2 :(得分:1)
您有两个不同的进程使用滚动appender记录到同一个日志文件。 Log4j不允许这样做。过去,我已经在集群Web应用程序中通过向日志文件添加服务器名称来解决此问题:appname-server1.log
和appname-server2.log
,每个服务器都配置为写入自己的日志。
这对于跟踪特定于一台计算机配置的错误也很有用。
如果您有两个不同的应用程序通过根据正在执行的应用程序命名文件来写入同一个日志文件,则上述所有操作也适用。
答案 3 :(得分: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 DEBUG [com.catalystwms.core.services.ServiceLocator
我认为可能发生的是线程2在14:47:01,288创建一个logRecord,当它尝试写入时,它需要锁定Logger的appender列表,但是另一个线程有锁并正忙着做IO所以线程2等待。线程1在14:54:27,429创建logRecord,它尝试获得相同的锁并等待。当释放锁时,OS将其提供给线程1并打印。
如果这是真的,那么另一个重要问题就是表现问题。代码路径可能会阻止记录IO。
答案 4 :(得分:-1)
在编写日志之前,您可能无法修复它。您可以尝试修改log4J以在每次写入后调用.flush(),但这会使您的代码变得更慢并且@Chris Nava的解决方案更合适。