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 级别只记录系统逻辑出错、异常或者重要的错误信息。 - 推荐】 尽量用英文来描述日志错误信息,如果日志中的错误信息用英文描述不清楚的话使用中文描述即可,否则容易产生歧义。
说明: 国际化团队或海外部署的服务器由于字符集问题,使用全英文来注释和描述日志错误信息。