使用log4j2时,日志文件为空

时间:2013-11-08 18:59:18

标签: java logging configuration log4j 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:\\logs\\log1.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>

它创建了我的文件,我记录了它,但它仍然是空的。当我尝试删除此文件时,操作系统告诉我它正在使用(如果应用程序当前正在工作),但即使我停止应用程序,文件仍然是空的。

那么我应该更改哪些设置才能使其正常工作?

2 个答案:

答案 0 :(得分:4)

我怀疑异步日志记录未正确启用。 从beta-9开始,无法在XML配置中打开Async Logger,您必须将系统属性Log4jContextSelector设置为"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"

您在日志中没有看到任何内容的原因是您的日志消息仍在缓冲区中并且尚未刷新到磁盘。如果打开Async Loggers,日志消息将自动刷新到磁盘。

答案 1 :(得分:2)

我分享了一个更清洁,更简单的解决方案。

https://stackoverflow.com/a/33467370/3397345

将名为log4j2.component.properties的文件添加到类路径中。这可以在大多数maven或gradle项目中通过将其保存在src / main / resources中来完成。

通过将以下行添加到文件中来设置上下文选择器的值。

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

Log4j将首先尝试读取系统属性。如果系统属性为null,则默认情况下它将回退到存储在此文件中的值。