文章目录

  • 1 主流框架
  • 2 日志级别
  • 3 打印日志格式
  • 4 何时打印日志
  • 5 日志规约


1 主流框架

目前主要使用slf4j做门面模式的日志框架,有利于维护和各个类的日志处理方式统一,实现是用Logback,新一代日志框架

2 日志级别

级别

描述

OFF

关闭:最高级别,不输出日志。

FATAL

致命:输出非常严重的可能会导致应用程序终止的错误。

ERROR

错误:输出错误,但应用还能继续运行。

WARN

警告:输出可能潜在的危险状况。

INFO

信息:输出应用运行过程的详细信息。

DEBUG

调试:输出更细致的对调试应用有用的信息。

TRACE

跟踪:输出更细致的程序运行轨迹。

ALL

所有:输出所有级别信息。

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
如果日志设置为 L ,一个级别为 P 的输出日志只有当 P >= L 时日志才会输出。

即如果日志级别 L 设置 INFO,只有 P 的输出级别为 INFO、WARN,后面的日志才会正常输出。

3 打印日志格式

使用占位符方式打印日志,避免不必要的字符拼接。
反例:

log.debug("this is log " + name);

当日志级别比debug大时,以下字符串还是会进行拼接,浪费性能。

正例:

log.debug("this is log:{} " , name);

4 何时打印日志

  • 遇到问题,需要打印日志排查问题,记录关键的变量,参数等可以协助排查问题;
  • 有多个if else if 等分支,需要埋点打印日志,用来确定进入哪个分支
  • 调用其他系统的接口,打印传参的日志,有利于排查问题;
  • 调用其系统接口返回值,如果有必要,也可以打印日志;

5 日志规约

可以参考阿里巴巴java开发手册。

  • 【强制】 避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置 additivity=false。
    正例:
<logger name="com.taobao.dubbo.config" additivity="false">
  • 【强制】 生产环境禁止直接使用 System.out 或 System.err 输出日志或使用e.printStackTrace()打印异常堆栈。
  • 【强制】 异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字 throws 往上抛出。
    正例: logger.error(各类参数或者对象 toString() + “_” + e.getMessage(), e);
    注:这里也要把参数等信息记录,不然不容易排查问题。
  • 【强制】 日志打印时禁止直接用 JSON 工具将对象转换成 String。
    说明: 如果对象里某些 get 方法被重写,存在抛出异常的情况,则可能会因为打印日志而影响正常业务流程的执行。
    正例: 打印日志时仅打印出业务相关属性值或者调用其**对象的 toString()**方法。
  • 【推荐】 可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适
    从。如非必要,请不要在此场景打出 error 级别,避免频繁报警。
    说明: 注意日志输出的级别, error 级别只记录系统逻辑出错、异常或者重要的错误信息。
  • 推荐】 尽量用英文来描述日志错误信息,如果日志中的错误信息用英文描述不清楚的话使用中文描述即可,否则容易产生歧义。
    说明: 国际化团队或海外部署的服务器由于字符集问题,使用全英文来注释和描述日志错误信息。