请原谅我好长时间。
我是日志记录实现的新手,我试图读取一个日志文件,该文件在每次运行构建时都会被覆盖。日志文件包含一些工作流程执行步骤的详细信息。
log4j2.xml文件的配置:-
<appenders>
<File name="InfoLog" fileName="build/var/debug.log" bufferedIO="true" immediateFlush="false" append="false">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS z}{UTC} ~ [%t] ~ %-5level ~ %logger{1} ~ %msg%n"/>
</File>
</appenders>
<loggers>
<Root level="Debug">
<AppenderRef ref="InfoLog"/>
</Root>
</loggers>
我的记录器实现的示例代码片段:-
Note → I have api calls to other services and require those logs too in my file, hence I used mu.KLogging library as it made it super easy. I wasn’t able to get the logs from calls to other apis, using java.util.logging or org.apache.log4j libraries.
import mu.KLogging
interface TestsLogger {
companion object {
val logger = KLogging().logger(" WORKFLOW STEPS ")
}
}
//In some class
logger.info { "Running ${(workflowMap.currentStep).toUpperCase()}" }
logger.error { workflowExecutionException }
现在,当我尝试读取debug.log文件(执行完所有步骤几秒钟后)时,由于某种原因,并不是从文件中读取了所有日志。
TimeUnit.MILLISECONDS.sleep(5_000)
var lines: List<String> = Files.readAllLines(File("build/var/debug.log").toPath())
在深入研究此类行为的原因时,我发现,当它尝试读取debug.log文件时,此时日志文件中没有所有日志。出于某种原因,当我的构建完成时,日志的最后几行会此刻追加到文件中。 尽管是,但是已经发生了执行,我需要从日志中获取信息。
FYI -> I am using Gradle Build in Intellij
我试图理解为什么这种奇怪的行为?我该如何解决这个问题
生成正确,并且我的文件读取了直到该刻生成的所有日志?
最佳答案
您已将bufferedIo设置为true,并且将InstantFlush设置为false。这对于长时间运行的经常写入日志的应用程序具有良好的性能,但对于写入不多的应用程序来说,这意味着日志事件将位于缓冲区中等待写入。除非应用程序关闭,否则应清除缓冲区,除非将其杀死或出现其他终端错误以使其无法正常终止。
关于file - 日志文件不会生成完整的日志,尽管执行已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61534376/