6

我在我的项目中使用 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>

它创建了我的文件,我在其中记录了一些内容,但它仍然是空的。当我试图删除这个文件时,操作系统告诉我它正在使用(如果应用程序当前正在运行),但即使我停止应用程序,文件仍然是空的。

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

4

2 回答 2

5

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

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

于 2013-11-09T03:12:42.333 回答
5

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

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

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

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

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

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

于 2016-08-16T09:29:29.230 回答