程序日志输出风格

October 28, 2021 · View on GitHub

日志重要性

  • 日志除了可以帮助自己、团队解决 bug 之外,还可以用来研究其他组件思路,比如修改 logback 根级别为 debug,可以看到组件的执行流程过程

明确禁止

  • 必须使用 @Slf4j 注解(Lombok)
  • 禁止使用字符串拼接,必须采用参数化方式使用参数
  • 禁止:e.printStackTrace(),必须使用工具类:ExceptionUtil.getStackTraceAsString(e)
  • 禁止:System.out
  • 禁止:密码等重要信息打印
  • 不要对可以预估非常大的参数值进行记录具体内容,而是记录其长度大小或是其他有意义的信息
  • 不要在循环(for, while)体里面写 log,除非明确数据量小
  • 不要记录重复的信息。有时候你会记录一些即将被传入某个方法的参数,然后你又忘记了,在函数内部把他又记录了一次。整个调用过程中要有侧重点。
  • application-testapplication-prod 配置里面不需要控制台输出

特别业务日志

  • 跟钱有关的任何操作
  • 短信接口,邮件接口
  • 上传 / 下载 / 导出 / 导入
  • 以上都需要记录什么时间,什么接口,是谁做了这类操作,方便后面分析。
  • 这几个功能都是比较消耗资源的操作,受到攻击需要日志做分析
  • error 级别 要有单独文件存储

特殊照顾的场景日志

  • audit 记录每个请求时间,超过 3 秒使用 info,超过 5 秒使用 warn,超过 7 秒 采用 error(三个级别都必须有特别的关键字,方便搜索)
  • 调用其他系统服务中请求的参数和返回结果要记录
  • 发送消息给 MQ,消息记录
  • 从 MQ 接收消息,消息记录
  • 对文件类操作,记录处理时间和处理数据量
  • 任务调度等各类定时作业
  • 各种开启类配置,记录状态变化
  • 集群系统要有系统标识,能在 log 中识别是哪个节点
  • Catch 捕获中,处理的参数需要记录(注意重复)
  • 重要的日志可以加上自己的开发人名英文全拼(全部小写),方便搜索
  • 多线程的要有线程信息
  • 跟钱有关系的任何接口都需要有详细记录变更
  • Log 一般在 Service 这一层进行书写,Controller 和 DAO 尽可能少

参考