файл журнала пуст при использовании log4j2
Я использую log4j2 в своем проекте примерно так:
logger.log(Level.ERROR, this.logData);
мой файл конфигурации выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" DLog4jContextSelector="org.apache.logging.log4j.core.async.AsyncLoggerContextSelector">
<Appenders>
<!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
<RandomAccessFile name="RandomAccessFile" fileName="C:logslog1.log" immediateFlush="false" append="false">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
</PatternLayout>
</RandomAccessFile>
</Appenders>
<Loggers>
<Root level="error" includeLocation="false">
<AppenderRef ref="RandomAccessFile"/>
</Root>
</Loggers>
Он создает мой файл, я что-то записываю в него, но он все еще пуст. Когда я пытаюсь удалить этот файл, OS сказала мне, что он используется (если приложение в настоящее время работает), но даже если я остановлю приложение, файл все еще пуст.
Итак, какие настройки я должен изменить, чтобы он работал правильно?
2 ответов
Я подозреваю, что асинхронное ведение журнала включено неправильно.
Начиная с beta-9 невозможно включить асинхронные регистраторы в конфигурации XML, необходимо задать системное свойство Log4jContextSelector
до "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"
.
причина, по которой вы ничего не видите в журнале, заключается в том, что ваши сообщения журнала все еще находятся в буфере и еще не были сброшены на диск. При включении асинхронных регистраторов сообщения журнала будут автоматически сбрасываться на диск.
Я разделяю более чистое и простое решение.
https://stackoverflow.com/a/33467370/3397345
Добавить файл с именем log4j2.component.properties
в вашем classpath. Это можно сделать в большинстве проектов maven или gradle, сохранив его в src/main/resources.
задайте значение для селектора контекста, добавив в файл следующую строку.
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
Log4j попытается сначала прочитать системное свойство. Если системное свойство равно null, то оно будет вернитесь к значениям, сохраненным в этом файле по умолчанию.