【问题标题】:Log4j2 doesn't write to file until java programm interrupted在 java 程序中断之前,Log4j2 不会写入文件
【发布时间】:2018-09-19 09:12:30
【问题描述】:

我在 Log4j2 XML 配置上停留了一段时间,无法弄清楚如何通过 RollingFile 和 RollingRandomAccessFile 附加程序写入文件。

当我启动 log4j2 时,它成功初始化,使用控制台附加程序和 System.out.println() 将日志写入控制台。但是当我做tail -f logs/error.logless logs/error.log 时,我并没有实时看到它。 但是在我kill -9 $jarpid 之后,它会立即写入日志文件,这样我就可以在尾部看到它。我认为 tail 可以阻止文件,但事实并非如此。我在运行时通过nano logs/error.log 读取了文件,它是空的,并且只有在杀死进程后才会出现文本。我已经提到这可能是因为我使用 RollingRandomAccessFile,可能是我遇到了这种“随机性”。但是 RollingFile 的行为是一样的。 我试图写另一个文件(谁知道,可能它已经被另一个应用程序使用了)。一样的。

现在很迷茫,想不通。

这是我的 log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Appenders>
        <RollingFile name="ErrorFile"
                                 fileName="logs/error.log"
                                 filePattern="logs/error-%d{MM-dd-yyyy}-%i.log.zip"
                                 immediateFlush="false"
                                 append="true"
                                 ignoreExceptions="false">
            <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%-5level] %d{dd.MM.yyyy HH:mm:ss} - %logger{36} - %msg%n" disableAnsi="false"/>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    <Console name="Console" target="SYSTEM_OUT" follow="true" ignoreExceptions="true">
        <PatternLayout pattern="[%highlight{%-5level}] %d{dd.MM.yyyy HH:mm:ss} - %logger{36} - %msg%n" disableAnsi="false"/>
    </Console>
</Appenders>
    <Loggers>
        <Root level="all" includeLocation="false">
            <AppenderRef ref="ErrorFile"/>
        </Root>
    </Loggers>
</Configuration>

这是我的 java 应用程序:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class test {
    public static Logger log = LogManager.getLogger(test.class);
    public static void main(String[] args) throws Exception{
        while (true) {
            log.debug("debug");
            log.error("error");
            System.out.println("JAR WORKS!"+System.currentTimeMillis());
            Thread.sleep(10000);
        }
    }
}

【问题讨论】:

  • 你试过设置 immediateFlush="true" 吗?
  • @darkPain 实际上我应该从这里开始。谢谢!
  • bugerya 没问题。如果有帮助,请告诉我。
  • @darkPain 帮了大忙。已经测试过了。问题解决了
  • 好的,很好。很高兴帮助@Alexey

标签: java logging real-time log4j2 tail


【解决方案1】:

根据log4j2 manualRollingFileAppender参数immediateFlush描述如下:

当设置为 true - 默认值时,每次写入后都会跟一个 冲洗。这将保证数据写入磁盘,但可以 影响性能。

每次写入后刷新仅在使用此附加程序时有用 使用同步记录器。异步记录器和附加器将 在一批事件结束时自动刷新,即使 immediateFlush 设置为 false。这也保证了数据是 写入磁盘但效率更高。

您在配置中将此参数设置为false,这意味着每次写入后数据不会写入磁盘。如果您希望每次写入后都刷新到磁盘,请将此参数设置为 true

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多