файл журнала пуст при использовании 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, то оно будет вернитесь к значениям, сохраненным в этом файле по умолчанию.