Java 19下java.util.logging日志为何不立即写入磁盘?
日志仅在程序终止后写入磁盘的原因分析(与JDK 19的关联)
这个现象和JDK 19没有直接关联,核心问题出在Java自带FileHandler的默认缓冲策略上:
FileHandler底层基于带缓冲的输出流实现文件写入,默认情况下,只有当缓冲区被填满、流被关闭,或者整个程序终止时,才会把内存缓冲区里的日志内容刷写到磁盘。- 你的代码里没有修改
FileHandler的刷新配置,也没有主动触发刷新操作,所以日志会一直暂存在内存里,直到程序结束才统一写入。
解决方法
配置
FileHandler自动刷新
修改FileHandler的初始化代码,通过setFlushLevel指定触发自动刷新的日志级别,比如只要输出INFO及以上级别日志就刷新:FileHandler fileHandler = new FileHandler("java_%u.log"); fileHandler.setFormatter(new SimpleFormatter()); // 设置INFO级别及以上日志触发自动刷新 fileHandler.setFlushLevel(Level.INFO); logger.addHandler(fileHandler);手动触发刷新(按需使用)
如果需要更精细的控制,可以在关键日志输出后,手动遍历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
相关产品推荐
相关产品推荐

