码出高效–日志

一: 日志规范
1,日志文件的生命周期:

如果日志存储周期较短,如7 天,那么针对有些具备以“周”为频次发生的异常就无法被发现,相反,若曰志保存周期过长,又会对碰盘存储空间造成较大压力,产生不必要的资源消耗。因此综合
两个方面考虑,代码规约推荐曰志文件至少保存1 5 天,可以根据日志文件的重要程度、文件大小及磁盘空间再自行延长保存时间。

2,预先判断曰志级别

对DEBUG 、INFO 级别的日志,必须使用条件输出或者使用占位待的方式打印。该约定综合考虑了程序的运行效率和日志打印需求。例如, 在某个配置了打印日志级别为W础N 的应用中,如果针对DEBUG 级别的日志,仅仅在程序中写出logger.
debug(”Processing trade with id:” + id + ” and symbol : ” + symbol); 那么该日志不会被打印, 但是会执行字符串拼接操作1 如果symbol 是对象, 还会执行to String() 方法,白白浪费了系统资源。如下示例代码为正确的打印日志方式

//使明条件吁所形式
if (logger.isDebugEnabled()) {
logger.debug (” E nc:ess_nJ t ade wi>_h id:+ id
+ ” and syml: ol : " + symbol) ;
//使用占{古符形式
logger .debug (” Processing trade with iJ: {} and 叩nbol : {} ” , 划, s严nbol) ;
3,区别对待错误日志

WARN 、ERROR 都是与错误有关的日志级别,但不要一发生错误就笼统地输出ERROR 级别日志。如 果输出为ERROR 级别就表示 出现就需要人为介入, 这显然不合理。所以, ERROR 级只记录系统逻辑错误、异常或者违反重要的业务规则, 其他错误都可以归为WARN级别。

4,保存记录内容完整

曰志记录的内容包括现场上下文信息与异常堆枝信息, 所以打印时需要注意以下两点:
(1) 记录异常时定要输出异常堆枝, 例如logger.error(” xxx ”+e . gctMessage‘(), e ) 。
( 2 ) 曰志中如果输出对象实例,要确保实例重写了toString, 否则只会输出对争的hashCode 值, 没苟实际需义。
综上所述, 日志是一个系统必不可少的组成部分, 但日志打印并非多多益善, 过的日志会降低系统性能, 也不利于快速定位问题,所以记录曰志时定请思考三个问题①日志是否有人看1 ②看到这条日志能做什么1 ③能不能提升问题排查效率。

二: 日志框架

1, 日志门面+日志库适配器 + 日志库(具体实现)
2, 新框架推荐使用: slf4 (日志门面)+ logback (日志库)