在 Java 中优化 Logger(日志记录器),通常围绕 性能、可控性、可维护性、资源占用 四个方面来做。下面从实践角度系统总结优化方法。
优先使用成熟框架,而不是直接用 System.out 或 java.util.logging:
✅ 推荐组合:
SLF4J + Logback / Log4j2
ERROR > WARN > INFO > DEBUG > TRACE
INFO 或 WARNDEBUGDEBUG/TRACEif (log.isDebugEnabled()) {
log.debug("user info: {}", user);
}
或使用占位符(推荐)
log.debug("user id = {}", userId);
❌ 错误写法(性能差):
log.debug("user id = " + userId);
<AsyncLogger name="com.example" level="info" includeLocation="false"/>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE"/>
</appender>
✅ 优势:
⚠ 注意:
for (Item item : list) {
log.info("item: {}", item);
}
✅ 改为:
log.info("items size = {}", list.size());
log.info("user: {}", user); // user 很大
✅ 只打印关键字段:
log.info("userId={}, name={}", user.getId(), user.getName());
<RollingFileAppender>
<rollingPolicy class="TimeBasedRollingPolicy">
<fileNamePattern>logs/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</RollingFileAppender>
✅ 避免:
<maxFileSize>100MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
❌ 禁止:
log.info("password={}", password);
✅ 脱敏:
log.info("phone={}", mask(phone));
❌ 错误:
log.error("error: " + e.getMessage());
✅ 正确:
log.error("order failed, orderId={}", orderId, e);
| 优化点 | 建议 |
|---|---|
| 日志框架 | SLF4J + Logback / Log4j2 |
| 日志级别 | 生产 INFO |
| 异步 | 开启 AsyncAppender |
| 输出方式 | 占位符 {} |
| 循环日志 | 禁止 |
| 文件管理 | 滚动 + 大小限制 |
| 敏感信息 | 脱敏 |
如果你愿意,我可以:
直接说你的使用场景即可。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。