Почему мои временные метки файла журнала 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)5
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, и он печатает.
Если это правда, то другой большой проблемой является производительность. Пути кода могут блокироваться при регистрации ввода-вывода.