【问题标题】:log file empty when using log4j2使用 log4j2 时日志文件为空
【发布时间】:2013-11-20 21:44:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: java logging configuration log4j log4j2


    【解决方案1】:

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

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

    【讨论】:

    • 你的意思是&lt;Configuration status="ERROR" DLog4jContextSelector="org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"&gt;不工作,我的记录器仍然以同步方式工作?
    • 是的,log4j 将忽略 DLog4jContextSelector 配置元素。
    • 抱歉这个问题,但是如果无法在 xml 文件中设置,我该如何设置?
    • 您需要将此设置为系统属性。对于独立应用程序,您可以在命令行上传递 -Dkey=value。紧要关头,您还可以编写 System.setProperty("key", "value");在你的代码中。对于 Web 应用程序,通常有一个配置文件,您可以在其中编辑系统属性。在这种情况下,请检查您的 webapp 容器的文档。
    • 是的,我的问题一半是由于延迟记录到文件,一半是由于配置错误。它是 'Root level="error"' 在 xml 中,但我用 Level.ALL 编写所以我将它更改为 level="ALL" 并开始工作。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 没错。所有 log4j2 系统属性都可以通过设计在类路径中的 log4j2.component.properties 文件中指定。
    猜你喜欢
    • 2021-11-06
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多