作为一名常年和线上 Bug 打交道的后端牛马,必须重视日志的重要性。日志写得烂,线上出问题只能抓瞎,花大半天定位问题;后来吃透了日志规范,排查问题效率直接翻倍,服务器也不再因为日志爆盘崩溃。

今天就把我实战总结的日志最佳实践全分享出来,帮你告别无效日志,写出优雅、高效、易排查的生产级日志。


在这里插入图片描述

一、为什么别用 System.out.println?

很多新手喜欢用System.out.println打日志,看似方便,实则隐患极大:

  • 同步阻塞 IO:频繁调用严重拖慢程序性能
  • 仅输出控制台:历史日志无法留存,排查历史问题直接抓瞎
  • 无格式、无级别、无管理:日志杂乱无章,无法过滤、切割、归档

正确选择:SpringBoot 默认集成SLF4J+Logback,开箱即用,无需额外引入依赖,功能强大还不折腾。


二、日志核心:分级打印,拒绝一锅炖

  1. DEBUG:开发调试用,生产环境关闭
  2. INFO:正常业务流程、关键节点、系统状态
  3. WARN:潜在风险,不影响主流程,但需关注
  4. ERROR:业务异常、系统错误,必须排查,必须带异常堆栈

java

运行

// 正确示例
log.debug("查询用户参数:{}", userId);
log.info("用户{}导入数据开始", userId);
log.warn("用户{}数据格式不规范,已跳过", userId);
log.error("用户{}数据导入失败", userId, e);

生产环境原则:级别设为INFO,屏蔽 DEBUG,只保留关键信息。


三、性能关键:用参数化日志,别拼接字符串

新手常犯错误:

java

运行

// 反面教材:字符串拼接,即使日志不输出也会执行,浪费性能
log.info("用户" + userId + "导入完成,耗时" + time + "ms");

正确写法:参数化占位符{}

java

运行

// 正面示例:日志框架仅在输出时替换,无性能损耗
log.info("用户{}导入完成,耗时{}ms", userId, time);

异常打印:直接传异常对象,自动打印完整堆栈,不用 e.printStackTrace ()。


在这里插入图片描述

四、日志时机:打在关键点,不冗余也不遗漏

日志不是越多越好,打在关键节点即可:

  • 方法入口:记录入参
  • 方法出口:记录出参 / 执行结果
  • 核心分支:判断逻辑、状态变更
  • 异常捕获:必打 ERROR,带堆栈
  • 第三方调用:接口、DB、MQ 交互

批量处理优化:循环中别每条都打,可每 N 条打一次汇总,或用 StringBuilder 拼接后统一输出,避免日志刷屏。

安全红线严禁打印敏感信息(密码、身份证、手机号、密钥),防止数据泄露。


五、高效排查:MDC 上下文追踪,一键定位全链路

MDC

java

运行

// 拦截器/过滤器中设置
MDC.put("requestId", UUID.randomUUID().toString());
MDC.put("userId", userId);

// 业务代码正常打日志,自动携带上下文
log.info("数据导入处理中");

// 请求结束清理
MDC.clear();

日志配置中加入%X{requestId},每条日志自带唯一标识,筛选某用户 / 某请求一目了然。


六、性能提升:启用异步日志,不阻塞主线程

异步日志

Logback 配置示例:

xml

<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
  <appender-ref ref="FILE" />
  <!-- 队列大小,根据并发调整 -->
  <queueSize>1024</queueSize>
</appender>

注意:异步日志在程序极端崩溃时,可能丢失缓冲区内日志,性能与完整性按需取舍


七、服务器救命:日志自动切割与清理

自动滚动、过期清理、压缩

  • 按天 / 按大小切割文件
  • 只保留最近 N 天日志
  • 自动压缩历史日志,节省空间

核心配置要点:

  • TimeBasedRollingPolicy:按天滚动
  • SizeAndTimeBasedRollingPolicy:大小 + 时间双策略
  • maxHistory:保留天数
  • cleanHistoryOnStart:启动自动清理

八、分布式进阶:ELK 集中化日志管理

ELK 栈

  • Logstash:收集各服务日志
  • Elasticsearch:存储、索引日志
  • Kibana:可视化界面,搜索、筛选、分析日志

小团队可先用轻量方案,中大型系统直接上 ELK,排查效率指数级提升。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐