Иногда происходят странные вещи, и перезагрузка виртуальной машины разрешит их.
Зайдите в диспетчер AVD, выберите свой экземпляр виртуальной машины, затем выберите больше и нажмите «стереть данные». Если это не сработает, просто удалите его и установите заново.
Два оператора журнала, происходящие на различных потоках.
(Распараллельте 1), 19.02.2009 14:54:27 429 ИНФОРМАЦИИ [com.catalystwms.tms.services.background.purge. PurgeManager]
(Распараллельте 2), 19.02.2009 14:47:01 288 ОТЛАДОК [com.catalystwms.core.services. ServiceLocator
Я полагаю, что время операторов журнала точно дает время, когда событие имело место, но просто записано не в порядке, потому что поток 2 ожидает для получения блокировки. Я верю обертыванию Вашего appender в org.apache.log4j. AsyncAppender должен устранить проблему.
Формат даты разработан, чтобы позволить простому символьно-ориентированному виду заказывать его правильно.
sort server.log | more
Править: Это полезно для использования на существующих файлах журнала (не для конфигурирования log4j).
У Вас есть два различных процесса, регистрирующиеся к тому же файлу журнала с прокруткой appender. Log4j не позволяет это. В прошлом я разрешил это в кластеризованном веб-приложении путем добавления имени сервера к файлу журнала: appname-server1.log
и appname-server2.log
с каждым сервером, настроенным для записи в их собственный журнал.
Это может также быть полезно для разыскивания ошибок, которые характерны для конфигурации одной машины по сравнению с другим.
Все вышеупомянутое также работает, если у Вас есть два различных приложения, пишущие в тот же файл журнала путем именования файлов на основе приложения выполняемыми.
В ответ на @andy:
(Распараллельте 1), 19.02.2009 14:54:27 429 ИНФОРМАЦИИ [com.catalystwms.tms.services.background.purge. PurgeManager]
(Распараллельте 2), 19.02.2009 14:47:01 288 ОТЛАДОК [com.catalystwms.core.services. ServiceLocator
то, чему я верю, может происходить, поток 2, создает запись журнала в 14:47:01 288, когда он пытается записать, это должно получить блокировку для списка Регистратора appenders, но другой поток имеет блокировку и занят, делая IO, так распараллельте 2, ожидает. поток 1 создает запись журнала в 14:54:27 429, это пытается получить ту же блокировку и также ожидает. Когда блокировка освобождена, ОС дает ее для поточной обработки 1, и она печатает.
Если это верно, что другой большой проблемой является одна из производительности. Пути выполнения кода могли заблокироваться при входе IO.
Вы, вероятно, не сможете зафиксировать его, прежде чем журнал будет записан. Вы могли попытаться изменить log4J для вызова .flush () после каждой записи, но это сделает код намного медленнее, и решение @Chris Nava является более соответствующим.