使用log4j2时,日志文件为空

sil*_*der 6 java configuration logging log4j log4j2

我在我的项目中使用log4j2,如下所示:

    logger.log(Level.ERROR, this.logData);
Run Code Online (Sandbox Code Playgroud)

我的配置文件如下所示:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

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

Rem*_*pma 5

我怀疑异步日志记录未正确打开。从beta-9版本开始,无法在XML配置中打开“异步记录器”,您必须将system属性设置Log4jContextSelector"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"

您在日志中看不到任何内容的原因是您的日志消息仍在缓冲区中,尚未刷新到磁盘。如果打开“异步记录器”,则日志消息将自动刷新到磁盘。


Dav*_*eas 5

我分享了一个更干净、更简单的解决方案。

/sf/answers/2342715931/

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

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

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
Run Code Online (Sandbox Code Playgroud)

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