在 Java 中使用 Logger(如 java.util.logging、Log4j、Logback 等)时出现“重复打印日志”,通常不是 Logger 本身有 bug,而是配置或代码使用方式导致同一条日志被多个地方输出。下面按常见原因给你梳理。
addHandlerLogger logger = Logger.getLogger("test");
logger.addHandler(new ConsoleHandler());
logger.addHandler(new ConsoleHandler());
➡ 结果:一条日志在控制台打印 两次
✅ 解决:
logger.setUseParentHandlers(false); // 避免父 Logger 也输出
// 或只 addHandler 一次
Java 的 Logger 是树形结构:
"" (root)
└── com
└── example
如果你在子 Logger 上加了 Handler,而父 Logger 也有 Handler:
Logger root = Logger.getLogger("");
root.addHandler(new ConsoleHandler());
Logger sub = Logger.getLogger("com.example");
sub.addHandler(new ConsoleHandler());
✅ 一条日志会被:
com.example 输出一次✅ 解决:
sub.setUseParentHandlers(false);
log4j.properties / logback.xml 被加载 两次结果:
✅ 检查:
find . -name "logback.xml"
find . -name "log4j*.properties"
✅ 确保:
logback-spring.xml 写了 <appender>✅ 解决:
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 不要重复定义 console -->
</configuration>
或:
logging:
pattern:
console: ""
try {
...
} catch (Exception e) {
e.printStackTrace(); // ← 控制台
log.error("error", e); // ← 又一次
}
✅ 解决:
log.error<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="CONSOLE"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ASYNC"/>
</root>
✅ 结果:CONSOLE 被引用两次
addHandlerprintStackTrace + log如果你能贴出:
我可以直接帮你定位是哪一条原因。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。