日志规范笔记
日志级别
日志是有级别的。针对不同的场景,日志被分为五种不同的级别, 按照重要程度由低到高排序
- DEBUG: 级别曰志记录对调试程序有帮助的信息。
- INFO: 级别日志用来记录程序运行现场,虽然此处并未发生错误,但是对排查其他错误具有指导意义。
- WARN: 级别日志也可以用来记录程序运行现场,但是更偏向于表明此处有出现潜在错误的可能。
- ERROR: 级别日志表明当前程序运行发生了错误,需要被关注。但是当前发生的错误,没有影响系统的继续运行。
- FATAL: 级别曰志表明当前程序运行出现了严重的错误事件,并且将会导致应用程序中断。
可以看出,以上不同级别的日志优先级和重要性不同,因此在打印日志时针对不同的日志级别要有不同的处理方式。
日志处理方式
预先判断日志级别
对 DEBUG 、INFO 级别的日志,必须使用条件输出或者使用占位待的方式打印。该约定综合考虑了程序的运行效率和日志打印需求。
// 使用条件判断形式 & 使用占位符形式 if(logger.isDebugEnabled()){ logger.debug("the error is {}", e.getMessage()) }
避免无效日志打印
生产环境禁止输出 DEBUG 曰志且有选择地输出使用 INFO日志。
使用 INFO、WARN 级别来记录业务行为信息时,一定要控制日志输出量,以免磁盘空间不足。同时要为曰志文件设置合理的生命周期, 及时清理过期的日志。
避免重复打印,务必在日志配置文件中设置 additivity=false ,示例如下
<logger name= "com.taobao" additivity=” false" >
区别对待错误日志
WARN 、ERROR 都是与错误有关的日志级别,但不要一发生错误就笼统地输出 ERROR 级别日志。一些业务异常是可以通过引导重试就能恢复正常的, 例如用户输入参数错误。在这种情况下,记录日志是为了在用户咨询时可以还原现场, 如果输出为 ERROR 级别就表示一旦出现就需要人为介入, 这显然不合理。所以, ERROR 级别只记录系统逻辑错误、异常或者违反重要的业务规则, 其他错误都可以归为 WARN 级别。
保证记录内容完整
曰志记录的内容包括现场上下文信息与异常堆栈信息, 所以打印时需要注意以下两点:
- 记录异常时定要输出异常堆栈, 例如 logger.error(“error is {}”, e.getMessage(), e);
- 曰志中如果输出对象实例,要确保实例类重写 toString 方法,否则只会输出对象的 hashCode 值, 没有实际意义。