使用ConsoleHandler时FINE及以下级别日志无法输出怎么办
问题原因
JDK自带的java.util.logging(简称JUL)的日志输出会经过两层级别校验,一层是Logger本身的级别,另一层是绑定的Handler的输出级别,只有两层都允许的级别才会实际输出。你遇到的问题大概率是两个原因:要么你修改的logging.properties没有被JVM正确加载,要么代码里只修改了Logger的级别,没有同步修改ConsoleHandler的级别。
解决方案
场景1:希望通过配置文件生效
必须在JVM启动参数里添加配置指定配置文件路径:-Djava.util.logging.config.file=/你存放配置文件的绝对路径/logging.properties
注意这个参数必须在程序启动前指定,不能在Java代码运行时动态设置,因为JUL的LogManager会在JVM启动初期就完成初始化,运行时修改参数不会生效。
如果你是修改JDK全局默认的配置文件,要确认修改的是对应路径的文件:
- JDK8及之前:
$JAVA_HOME/jre/lib/logging.properties - JDK9及之后:
$JAVA_HOME/conf/logging.properties
场景2:不想改配置/启动参数,直接用代码设置
光设置RootLogger的级别不够,还需要手动修改ConsoleHandler的输出级别,示例代码如下:
import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.Logger; public class LogTest { public static void main(String[] args) { Logger root = Logger.getLogger(""); root.setLevel(Level.FINEST); // 遍历所有Handler,修改ConsoleHandler的输出级别 for (var handler : root.getHandlers()) { if (handler instanceof ConsoleHandler) { handler.setLevel(Level.FINEST); } } // 测试日志 root.severe("Severe"); root.warning("Warning"); root.info("Info"); root.fine("Fine"); root.finer("Finer"); root.finest("Finest"); } }
场景3:以上操作都无效
检查项目是否引入了slf4j-jdk14等JUL桥接包,如果有桥接逻辑,JUL的日志会被转发到slf4j对应的实现框架(比如logback、log4j),此时JUL本身的配置全部失效,需要去对应日志框架的配置文件中调整日志级别。
内容的提问来源于stack exchange,提问作者MAO3J1m0Op
相关产品推荐
相关产品推荐

