You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 19下java.util.logging日志为何不立即写入磁盘?

日志仅在程序终止后写入磁盘的原因分析(与JDK 19的关联)

这个现象和JDK 19没有直接关联,核心问题出在Java自带FileHandler的默认缓冲策略上:

  • FileHandler底层基于带缓冲的输出流实现文件写入,默认情况下,只有当缓冲区被填满、流被关闭,或者整个程序终止时,才会把内存缓冲区里的日志内容刷写到磁盘。
  • 你的代码里没有修改FileHandler的刷新配置,也没有主动触发刷新操作,所以日志会一直暂存在内存里,直到程序结束才统一写入。

解决方法

  1. 配置FileHandler自动刷新
    修改FileHandler的初始化代码,通过setFlushLevel指定触发自动刷新的日志级别,比如只要输出INFO及以上级别日志就刷新:

    FileHandler fileHandler = new FileHandler("java_%u.log");
    fileHandler.setFormatter(new SimpleFormatter());
    // 设置INFO级别及以上日志触发自动刷新
    fileHandler.setFlushLevel(Level.INFO);
    logger.addHandler(fileHandler);
    
  2. 手动触发刷新(按需使用)
    如果需要更精细的控制,可以在关键日志输出后,手动遍历Handler调用flush():

    logger.info("Main started");
    for (Handler handler : logger.getHandlers()) {
        handler.flush();
    }
    

补充说明

不管是JDK 8还是JDK 19,FileHandler的默认缓冲行为都是一致的,所以这个问题和JDK版本无关。IntelliJ和命令行运行表现相同,也是因为两者都沿用了JDK默认的FileHandler配置,没有调整缓冲策略。

内容的提问来源于stack exchange,提问作者Marvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:55:19