程序日志输出风格
October 28, 2021 · View on GitHub
日志重要性
- 日志除了可以帮助自己、团队解决 bug 之外,还可以用来研究其他组件思路,比如修改 logback 根级别为 debug,可以看到组件的执行流程过程
明确禁止
- 必须使用
@Slf4j注解(Lombok) - 禁止使用字符串拼接,必须采用参数化方式使用参数
- 禁止:
e.printStackTrace(),必须使用工具类:ExceptionUtil.getStackTraceAsString(e) - 禁止:
System.out - 禁止:密码等重要信息打印
- 不要对可以预估非常大的参数值进行记录具体内容,而是记录其长度大小或是其他有意义的信息
- 不要在循环
(for, while)体里面写 log,除非明确数据量小 - 不要记录重复的信息。有时候你会记录一些即将被传入某个方法的参数,然后你又忘记了,在函数内部把他又记录了一次。整个调用过程中要有侧重点。
application-test,application-prod配置里面不需要控制台输出
特别业务日志
- 跟钱有关的任何操作
- 短信接口,邮件接口
- 上传 / 下载 / 导出 / 导入
- 以上都需要记录什么时间,什么接口,是谁做了这类操作,方便后面分析。
- 这几个功能都是比较消耗资源的操作,受到攻击需要日志做分析
error 级别要有单独文件存储
特殊照顾的场景日志
- audit 记录每个请求时间,超过 3 秒使用
info,超过 5 秒使用warn,超过 7 秒 采用error(三个级别都必须有特别的关键字,方便搜索) - 调用其他系统服务中请求的参数和返回结果要记录
- 发送消息给 MQ,消息记录
- 从 MQ 接收消息,消息记录
- 对文件类操作,记录处理时间和处理数据量
- 任务调度等各类定时作业
- 各种开启类配置,记录状态变化
- 集群系统要有系统标识,能在 log 中识别是哪个节点
- Catch 捕获中,处理的参数需要记录(注意重复)
- 重要的日志可以加上自己的开发人名英文全拼(全部小写),方便搜索
- 多线程的要有线程信息
- 跟钱有关系的任何接口都需要有详细记录变更
- Log 一般在 Service 这一层进行书写,Controller 和 DAO 尽可能少