背景

  1. 阐述记录日志的重要性。
  2. 如何记录日志。

过程

  • 记录日志的重要性
  1. 以前一直以为能够把代码写好,没有bug,且稳定就是一件最重要的事情,但是,现在我到是觉得记录日志的这件事反而比代码的实现更为重要。
  2. 以前,我们的航海家就会记录航海日志,把这些过程和细节都记录下来,以便让我们或者后来的人知道发生了什么。
  3. 如果实现的代码没有日志,就是一个黑盒子,我们完全不知道里面的运行过程,当前运行到哪一步了,接下来可能又会运行那部分逻辑。
  4. 如果没有实现的代码没有日志,一旦线上出现问题,因为测试用例也无法完全覆盖所有的场景,那么就非常难以定位问题。没有定位到问题,那么就一定无法解决问题的。
  • 记录日志的细节
  1. 记录日志细节一:本应用服务与第三方服务接口进行交互
    (1) 那么就需要把请求参数和响应内容的原文记录下来,千万不要先进行处理,比如响应内容转json对象的这样的处理。因为随着时间的推移很难确定响应内容的原文是否被修改了
  2. 记录日志细节二:本应用服务与他服务交互
    (1)生产消息到MQ服务中。记录一条日志说,关于某个订单id的状态消息生产成功并同步至mq服务器上。
    (2)更新状态到关系型数据库。记录一条日志,关于某个订单id的状态更新成功或者更新失败并备注好原因。
  3. 日志记录细节三: 在操作前还是操作后
    (1)假如有一个方法或者理解成某个具体的业务操作过程,这个方法做什么样的业务逻辑不关心,我们的日志要记录这个操作。
    (2)如果记录的日志内容不需要这个操作的返回值(方法的返回值),那么记录在这个操作之前。
    (3)如果记录的日志内容需要这个方法的返回值参与,那么记录在这个操作之后即可。
  4. 日志记录细节四: 需要考虑到串行还是并行
    (1)如果是串行化执行的话,就直接参考日志记录细节三
    (2)如果是并行的话(比如多线程的方式),那么记录在之前与之前关系也不大。随机选择即可。
  5. 记录日志细节五:唯一标识 + 具体操作 + 操作结果
    (1)以订单为例子。假如关于此订单有一个比较复杂的业务逻辑处理过程,也是具体的某些操作很多,那么这个过程,我们应该怎么记录呢?
    (2)整个流程,都采用一个或者两个唯一标识id进行记录。也就是说每个操作都这样记录:订单ID:111111,更新订单状态成功或者失败(备注好失败的原因)。这样做话,关于这个订单的全流程就规范化和标准化了。关于这个订单的流转过程就一目了然了。
  6. 记录日志细节六:调试日志
    (1)比如第三方来对接自己系统时需要签名,如果是错误的签名,则把它错误的签名信息记录下来,同时也把正确的签名内容也要计算出来并记录好日志。

结论

  • 把细节做好,其实就很优秀了。