Почему мои временные метки файла журнала Log4j не в порядке и как это исправить?

Мой 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] 

Помогите, пожалуйста.

Спасибо,

Ответов (5)

Формат даты разработан для того, чтобы упорядочить ее правильно при простой сортировке на основе символов.

sort server.log | more

РЕДАКТИРОВАТЬ: это полезно для использования в существующих файлах журнала (не для настройки log4j).

Вероятно, вы не сможете исправить это до того, как будет записан журнал. Вы можете попробовать изменить log4J для вызова .flush () после каждой записи, но это сделает ваш код намного медленнее, и решение @Chris Nava будет более подходящим.

Are the two log statements occurring on different threads.

(Тема 1) 19 февраля 2009 г. 14: 54: 27,429 ИНФОРМАЦИЯ [com.catalystwms.tms.services.background.purge.PurgeManager]
(Тема 2) 19 февраля 2009 г. 14: 47: 01,288 ОТЛАДКА [com.catalystwms. core.services.ServiceLocator

Я считаю, что время операторов журнала точно указывает время, когда произошло событие, но они просто записываются не по порядку, потому что поток 2 ожидает блокировки. Я считаю, что упаковка вашего приложения в org.apache.log4j.AsyncAppender должна решить проблему.

У вас есть два разных процесса, записывающих в один и тот же файл журнала с помощью скользящего приложения. Log4j не позволяет этого. Раньше я разрешал эту проблему в кластеризованном веб-приложении, добавляя имя сервера в файл журнала: appname-server1.log и appname-server2.log каждый сервер был настроен на запись в свой собственный журнал.

Это также может быть полезно для отслеживания ошибок, которые характерны для конфигурации одной машины по сравнению с другой.

Все вышеперечисленное также работает, если у вас есть два разных приложения, которые записывают в один и тот же файл журнала, называя файлы в зависимости от выполняемого приложения.

В ответ на @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 создает logRecord в 14: 47: 01,288, когда он пытается писать, ему нужно получить блокировку для списка приложений Logger, но другой поток имеет блокировку и занят выполнением ввода-вывода, поэтому поток 2 ожидания. поток 1 создает logRecord в 14: 54: 27,429, он пытается получить ту же блокировку и также ждет. Когда блокировка освобождается, ОС передает ее потоку 1, и он печатает.

Если это правда, то другой большой проблемой является производительность. Пути кода могут блокироваться при регистрации ввода-вывода.