在 Java 里常说 “Logger 性能差”,通常不是指日志框架本身算法慢,而是指用得不对或配置不当,导致在高频调用路径上产生了大量额外开销。下面从原理和常见误区解释。
logger.debug("user=" + user + ", order=" + order);
问题:
debug 级别被关闭StringBuilder、String 对象、GC 压力✅ 正确写法:
logger.debug("user={}, order={}", user, order);
或
if (logger.isDebugEnabled()) {
logger.debug("user=" + user);
}
很多人在生产环境开了 DEBUG / TRACE,但代码里:
结果:
✅ 原则:
INFO 或以上经典实现(如早期 Log4j 1.x):
logger.info("...");
// 直接写文件 / 控制台(同步)
问题:
✅ 优化方案:
❌ 错误示例:
Logger logger = LoggerFactory.getLogger(this.getClass());
放在方法里、循环里频繁调用
✅ 正确:
private static final Logger logger =
LoggerFactory.getLogger(Xxx.class);
这些都是 I/O 黑洞
logger.error("error", e);
一次异常:
高频异常 = 性能灾难
✅ 不建议在热点路径疯狂打异常
| 框架 | 性能 | 说明 |
|---|---|---|
| Log4j 1.x | ❌ 差 | 同步、已废弃 |
| java.util.logging | ❌ 一般 | 性能弱 |
| Logback | ✅ 好 | 默认同步,可异步 |
| Log4j2 | ⭐ 极强 | 异步 + Disruptor |
不慢
慢的是:
{} 占位符如果你愿意,我可以:
直接贴代码或场景就行。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。