Java Logger日志重复输出,执行main后生成55条冗余日志如何解决
问题根因
你遇到的日志重复问题核心出在log方法的错误配置逻辑:logger.addHandler()是追加逻辑而非覆盖逻辑,你每调用1次log方法就给当前logger追加1次相同的fileHandler实例。循环调用10次log方法后,logger上一共绑定了10个fileHandler,输出第一条日志时1个handler写入,第二条2个……第10条10个,总日志数为1+2+…+10=55,和你反馈的冗余数量完全匹配。
修复方案
1. 代码调整
所有日志配置(handler注册、formatter设置、父处理器开关)全局仅初始化1次,不要放在业务日志输出方法中重复执行,修改后的代码如下:
import java.io.FileInputStream; import java.io.IOException; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import java.util.logging.Handler; public class LoggerHelper { // 建议使用当前类作为logger名,避免和JDK自带Logger冲突 private final static Logger logger = Logger.getLogger(LoggerHelper.class.getName()); private static Handler fileHandler; public static void main(String[] args) { for (int i = 0; i < 10; i++) { log(Level.INFO, true, "Message: " + i); } } // log方法仅保留日志输出逻辑 public static void log(Level level, Boolean console, String... message) { // 仅当需要动态开关控制台输出时保留这行,不需要可以直接删除,在配置文件统一设置即可 logger.setUseParentHandlers(console); for (String string : message) { logger.log(level, string); } // 如果希望控制台开关不影响其他调用,可在这里把useParentHandlers重置回默认值 } static { try { LogManager.getLogManager().readConfiguration(new FileInputStream("logging.properties")); fileHandler = new FileHandler("Logs/log.log", 0, 1, true); // 全局仅设置1次formatter fileHandler.setFormatter(new LogFormatter()); // 全局仅添加1次fileHandler logger.addHandler(fileHandler); // 如果不需要动态控制控制台输出,可在这里统一设置useParentHandlers // logger.setUseParentHandlers(true); } catch (IOException e) { e.printStackTrace(); } } }
2. 可选配置优化
如果不需要每次调用日志时动态控制是否输出到控制台,可以直接删除log方法中的logger.setUseParentHandlers(console)行,统一在logging.properties中配置即可,现有配置无需额外调整即可正常运行。
内容的提问来源于stack exchange,提问作者Michał
相关产品推荐
相关产品推荐

