使用System.Logger时如何设置日志级别以输出DEBUG日志
问题根因
你的配置不生效是因为java.util.logging(JUL,即System.Logger默认底层实现)的日志输出受两层规则控制:
- 首先是
Logger实例本身的日志级别,默认全局根Logger的级别为INFO,低于INFO级别的日志会直接在Logger层被拦截,不会向下传递 - 其次才是Handler的日志级别,你仅配置了ConsoleHandler的级别为FINEST,但Logger本身的级别没有放开,因此DEBUG日志无法输出。
System.Logger与JUL级别映射关系
对应关系如下,配置时需要注意匹配:
System.Logger.Level.TRACE→ JULLevel.FINESTSystem.Logger.Level.DEBUG→ JULLevel.FINESystem.Logger.Level.INFO→ JULLevel.INFOSystem.Logger.Level.WARNING→ JULLevel.WARNINGSystem.Logger.Level.ERROR→ JULLevel.SEVERE
解决方法
方法1:代码内直接配置(适合测试/快速验证场景)
直接获取对应类的JUL Logger实例,修改其级别即可,修改后的代码如下:
import java.util.logging.Level; import java.util.logging.Logger; class LogTest { static { System.setProperty("java.util.logging.SimpleFormatter.format", "%1$tF: %5$s%n"); System.setProperty("java.util.logging.ConsoleHandler.level", "FINEST"); // 配置当前类对应的Logger级别为FINE,对应System.Logger的DEBUG级别 Logger.getLogger(LogTest.class.getName()).setLevel(Level.FINE); // 如果需要全局所有Logger都生效,可以配置根Logger: // Logger.getLogger("").setLevel(Level.FINE); } public static void main(String[] args) { System.getLogger(LogTest.class.getName()) .log(System.Logger.Level.INFO, "info"); System.getLogger(LogTest.class.getName()) .log(System.Logger.Level.DEBUG, "debug"); } }
运行后即可同时看到INFO和DEBUG级别的日志输出。
方法2:使用外部配置文件(适合生产环境)
创建独立的JUL配置文件logging.properties,内容如下:
# 全局默认日志级别,配置为FINE支持输出DEBUG日志 .level = FINE # 控制台Handler配置 java.util.logging.ConsoleHandler.level = FINEST java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter java.util.logging.SimpleFormatter.format = %1$tF: %5$s%n # 也可单独为指定类/包配置级别,优先级高于全局配置 # com.example.LogTest.level = FINE
启动应用时添加JVM参数指定配置文件路径即可,无需在代码中硬编码配置:
-Djava.util.logging.config.file=path/to/your/logging.properties
注意事项
- 子Logger会默认继承父Logger的级别,单独配置子Logger的级别会覆盖继承的配置
- 若classpath中存在其他System.Logger实现(如log4j、slf4j的System Logger适配包),需确认当前使用的后端为JUL,否则JUL相关配置不会生效。
内容的提问来源于stack exchange,提问作者Benjamin Reed
相关产品推荐
相关产品推荐

