如何临时禁用并恢复java.util.logging日志功能?
用java.util.logging临时禁用指定日志并恢复的解决方案
刚好之前碰过类似的需求,java.util.logging完全能实现你想要的「临时禁用→执行任务→恢复日志」的流程,核心思路就是先保存当前的日志配置,执行任务时临时调整日志级别屏蔽无用输出,任务结束后再把配置还原回去。
实现思路
- 先记录下根Logger(或者目标库的专属Logger)以及所有关联Handler的原始日志级别
- 执行任务时,把这些Logger和Handler的级别设为
Level.OFF(完全关闭日志)或者Level.SEVERE(只保留严重错误日志,看你需求选) - 任务完成后,用之前保存的配置恢复日志输出,一定要用finally块确保恢复操作执行,避免任务抛异常导致日志一直关闭
代码实现
全局日志临时禁用方案
如果需要全局屏蔽所有日志,可以用这个工具类:
import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; public class TempLogDisabler { // 保存原始日志级别 private static Level originalRootLevel; private static Level[] originalHandlerLevels; public static void disableAllLogs() { Logger rootLogger = Logger.getLogger(""); // 保存根Logger的原始级别 originalRootLevel = rootLogger.getLevel(); // 保存所有Handler的原始级别并临时关闭 Handler[] handlers = rootLogger.getHandlers(); originalHandlerLevels = new Level[handlers.length]; for (int i = 0; i < handlers.length; i++) { originalHandlerLevels[i] = handlers[i].getLevel(); handlers[i].setLevel(Level.OFF); } // 关闭根Logger的日志输出 rootLogger.setLevel(Level.OFF); } public static void restoreLogs() { Logger rootLogger = Logger.getLogger(""); // 恢复根Logger级别 if (originalRootLevel != null) { rootLogger.setLevel(originalRootLevel); } // 恢复所有Handler级别 Handler[] handlers = rootLogger.getHandlers(); if (originalHandlerLevels != null && originalHandlerLevels.length == handlers.length) { for (int i = 0; i < handlers.length; i++) { handlers[i].setLevel(originalHandlerLevels[i]); } } // 清空缓存,避免重复恢复出问题 originalRootLevel = null; originalHandlerLevels = null; } }
使用方式就和你预想的一样,记得套finally:
TempLogDisabler.disableAllLogs(); try { taskThatMakesUnnecessaryLogs(); // 执行产生大量无用日志的任务 } finally { TempLogDisabler.restoreLogs(); // 无论任务成功失败,都恢复日志 }
更精准的:只禁用目标库的日志
如果只是那个第三方库的日志烦人,推荐只针对它的Logger调整级别,这样不会影响你自己代码的日志输出:
// 假设第三方库的Logger命名空间是com.example.thirdparty Logger thirdPartyLogger = Logger.getLogger("com.example.thirdparty"); Level originalLevel = thirdPartyLogger.getLevel(); thirdPartyLogger.setLevel(Level.OFF); try { taskThatMakesUnnecessaryLogs(); } finally { thirdPartyLogger.setLevel(originalLevel); }
小提醒
- 别忘用finally块!如果任务执行中抛出异常,没finally的话日志会一直处于关闭状态,排查问题时会哭的
- 如果目标库的日志是通过自定义Handler输出的,记得也要处理Handler的级别,不然可能还是会有日志漏出来
内容的提问来源于stack exchange,提问作者Sarp
相关产品推荐
相关产品推荐

