生产环境必须同步将 logger 和 handler 级别设为 info 或更高,仅改其一无效;推荐通过 logging.properties 外置配置,并实测验证 debug 日志不输出,同时避免日志语句产生副作用。

生产环境中关闭不必要的 DEBUG 日志,核心是**确保 DEBUG 级别日志不被记录也不被输出**,不能只改一处——必须同时控制 Logger 和 Handler 两个环节的级别。
Logger 和 Handler 必须都设为 INFO 或更高
java.util.logging 中,日志要真正出现,需同时满足两个条件:
- Logger 实例的级别(
logger.setLevel(Level.INFO))允许该日志通过 - 所绑定的 Handler(如 ConsoleHandler、FileHandler)级别也允许(
handler.setLevel(Level.INFO))
如果 Logger 设为 INFO,但 Handler 是 DEBUG,INFO 日志仍会传过去并输出;反之,若 Handler 是 WARNING,即使 Logger 是 ALL,INFO 日志也会在 Handler 这一级被拦下。所以生产环境务必两者同步设为 INFO、WARNING 或 SEVERE。
用 logging.properties 统一外置配置(推荐)
避免硬编码,便于环境切换。在 logging.properties 中明确指定:
- 全局默认级别:
.level = INFO - 文件输出(常用):
java.util.logging.FileHandler.level = INFO - 控制台输出(可更保守):
java.util.logging.ConsoleHandler.level = WARNING - 应用专属 Logger(如
com.example.service):com.example.service.level = INFO
启动时加 JVM 参数:-Djava.util.logging.config.file=./logging.properties,配置立即生效。
验证 DEBUG 是否真被屏蔽
光看配置不够,得实测。在代码中写一句:
logger.fine("This is a DEBUG-level message");然后检查日志文件和控制台——它不应出现。如果出现了,说明某处 Logger 或 Handler 的级别仍为 ALL 或 FINE/FINER/FINEST,需逐个排查。
额外注意:避免 DEBUG 日志产生副作用
即使 DEBUG 被过滤,日志语句里的参数计算仍可能执行,造成性能浪费。例如:
logger.fine("User info: " + loadUserInfoFromDB(userId));应改用参数化写法(Log4j/SLF4J 支持,java.util.logging 原生不支持,需手动判断):
if (logger.isLoggable(Level.FINE)) {logger.fine("User info: " + loadUserInfoFromDB(userId));
}
这样在 DEBUG 关闭时,loadUserInfoFromDB 根本不会调用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











