在Java程序中断之前,Log4j2不会写入文件

时间:2018-09-19 09:12:30

标签: java logging real-time log4j2 tail

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

启动log4j2时,它将成功初始化,并使用控制台附加程序和System.out.println()将日志写入控制台。但是当我执行tail -f logs/error.logless logs/error.log时,我不会实时看到它。 但是在我kill -9 $jarpid之后,它立即写入日志文件,因此我可以在尾部看到它。我以为尾巴会阻止文件,但事实并非如此。我已经在运行时通过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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

每个log4j2 manualRollingFileAppender参数immediateFlush如下:

  

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

     

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

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