【发布时间】:2018-09-19 09:12:30
【问题描述】:
我在 Log4j2 XML 配置上停留了一段时间,无法弄清楚如何通过 RollingFile 和 RollingRandomAccessFile 附加程序写入文件。
当我启动 log4j2 时,它成功初始化,使用控制台附加程序和 System.out.println() 将日志写入控制台。但是当我做tail -f logs/error.log 或less 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