当前位置: 首页 > 知识库问答 >
问题:

直到java程序中断,log4j2才写入文件

陶飞英
2023-03-14

我研究log4j2xml配置已经有一段时间了,无法通过RollingFile和RollingRandomAccessFile appender了解如何写入文件。

当我启动log4j2时,它成功地初始化了日志,并使用控制台附加程序和系统将日志写入控制台。出来println()。但是当我做tail-f日志/错误时。日志更少的日志/错误。日志我没有实时看到它。但在我kill-9$jarpid之后,它会立即写入日志文件,这样我就可以在后面看到它了。我以为tail可以阻止文件,但它不能。我在运行时通过nano日志/error读取了文件。日志,它是空的,只有在终止进程后才出现文本。我提到过,这可能是因为我使用了RollingHandomAccessFile,可能是因为我体验到了这种“随机性”。但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个答案

谷梁博易
2023-03-14

根据log4j2手册,RollingFileAppender参数的描述如下:

当设置为true-默认值时,每次写入后会刷新。这将保证数据被写入磁盘,但可能会影响性能。

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

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

 类似资料:
  • 问题内容: 我正在运行测试,发现直到我按住C键终止程序后,该文件才真正被写入。谁能解释为什么会这样? 我希望它可以同时写入,因此可以在过程中间读取文件。 问题答案: 写到磁盘的速度很慢,因此许多程序将写操作存储到大块中,然后一次写一次。这称为 缓冲 ,当您打开文件时,Python会自动进行 缓冲 。 写入文件时,实际上是在写入内存中的“缓冲区”。填满后,Python会自动将其写入磁盘。您可以通过以

  • 我使用带有yaml配置的Log4j2。将日志记录到控制台工作得很好,每次都会创建一个外部日志文件,但它没有条目。谢谢你的提示。 src/Main/java/my/example/log/: 创建但为空的文件是

  • 理想情况下,我想在localhost上记录开发过程中的一切,只记录实时服务器上的错误。我在我的开发平台(Windows 10,JavaWicket)上无法登录文件。 log4j2.xml 我已经设法得到一些日志写入我tomcat的文件夹。 只有我的一些信息出现了。我不知道什么符号有意义,什么符号没有意义。 可公开访问页面的基页记录子类。 [信息]2017-10-19 17:07:13.208[ht

  • 问题内容: 今天,有人告诉我 “ Java EE程序员不写文件” 。为什么不能从Java EE容器(例如从JBoss)写入文件?怎么了? 问题答案: 最好看的页面是这个页面:http : //www.oracle.com/technetwork/java/restrictions-142267.html 它详细介绍了Java EE编程模型的限制。 除了上述要点之外,安全性,可移植性,群集性,线程化

  • 问题 你想像一个文件中写入数据,但是前提必须是这个文件在文件系统上不存在。 也就是不允许覆盖已存在的文件内容。 解决方案 可以在 open() 函数中使用 x 模式来代替 w 模式的方法来解决这个问题。比如: >>> with open('somefile', 'wt') as f: ... f.write('Hello\n') ... >>> with open('somefile',

  • 在中有一个,可以将日志写入到。 我需要在中使用相同的功能,但我还没有找到这样做的选项。有人知道如何使用实现同样的效果吗?