我在Log4j2 XML配置上停留了一段时间,无法弄清楚RollingFile和RollingRandomAccessFile附加器如何写入文件。
启动log4j2时,它将成功初始化,并使用控制台附加程序和System.out.println()将日志写入控制台。但是当我执行tail -f logs/error.log
或less 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);
}
}
}
答案 0 :(得分:1)
每个log4j2 manual的RollingFileAppender
参数immediateFlush
如下:
设置为true时-默认值,每次写入后都会跟一个 冲洗。这样可以保证将数据写入磁盘,但是可以 影响性能。
每次写入后刷新仅在使用此附加程序时有用 与同步记录器。异步记录器和附加器将 在一批事件结束时自动刷新,即使 InstantFlush设置为false。这也保证了数据是 写入磁盘,但效率更高。
您已在配置中将此参数设置为false
,这意味着数据在每次写入后都不会写入磁盘。如果要在每次写入后都刷新磁盘,则将此参数设置为true
。