怎样在代码中记录日志

为什么要记日志

在代码中记录日志一般有两个目的:Troubleshooting和记录程序运行状态。这两个目的是相辅相成的,如果不能记录当时程序运行状态那么没法做故障排除。在记录日志时一定要包含足够多的体现当时程序运行状态的信息,以帮助程序员定位问题。

日志规范

日志记录的途径有很多,大家最熟悉的莫过于直接打印输出,这也是最简单的一种方式。在实际项目中通常不建议这种做法,因为通过打印输出的信息只会显示在控制台,非常不便于出现问题时分析,所以一般的做法是写入日志到文件中。

为了让日志记录的内容足够提供分析、定位问题的依据,我们有必要对它的用法做一个分析,期望能够至少搞清楚两件事情:

在什么位置记录

记录日志的位置非常重要,不能在代码中随意的记录而造成记录日志的代码比业务处理的代码还多,下面分两部分介绍。

哪些地方可以记录

  1. 函数(方法)调用前后
    • 在当前函数(方法)内调用其它位置的函数(方法)、api接口和其它模块接口时应该记录
    • 函数(方法)在执行过程中重要变量的变化状态应该记录
    • 系统的入口与出口
  2. 实例的初始化和销毁(析构)方法
    • 捕捉异常时应该记录
    • 非预期执行时应该记录
  3. 比如在执行某条sql修改数据时,当返回结果为0通常是修改没有成功,虽然不会导致程序出错,但站在业务的角度看算是一个问题,这也是很多程序员非常容易疏漏的地方。
    • 另外else的部分通常是业务执行流程分叉的部分,那么为何没有朝主线执行下去?为了便于后续分析、定位问题,需要进行记录。

记录什么东西

记录能够体现出当时程序运行状态的信息,这些信息无非就是变量值、以及当时操作的业务说明等。这些信息应该综合起来一并记录下来,不能只记录变量而不讲清楚当时在做什么业务操作,也不能反过来。

  1. 程序运行时间、大批量数据的执行进度
  2. 关键变量、线程名称
  3. 正在做哪些重要的事情

日志的格式有没有规范

日志级别

程序在运行过程中有很多日志信息,这些信息按照重要程度和用途是可以进行分类的,比如开发期间的调试信息、业务处理异常时的警告类信息、程序运行中的错误信息等等。目前各个开发语言对日志级别都有分类,并不完全相同,基本上可以概括为以下几种:

  • DEBUG或 TRACE在调试期间跟踪一段代码的运行状态,一般在开发结束时会被移除。
  • INFO记录在关键路径上的状态信息
  • WARNING 记录运行过程中出现的意外事件
  • 记录日志ERROR记录应该尽快处理的致命错误

格式

日志输出来后在每种开发语言下表现都不太一样,不过你可以进行定制,常见的一些属性比如有记录时间、当前线程编号、当前执行的类文件、日志级别和日志内容,其中日志内容部分就是自己在代码中输出的业务操作说明 + 变量信息。

我们不用去管日志输出的最终格式如何,应该关注的是自己在代码中记录的内容,必须也应该包含两部分:业务操作说明 + 变量信息,两者缺一不可,都应该同时记录下来。