日志打印技巧

333 阅读2分钟

1、选择合适的日志打印级别

  • error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的
  • warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注
  • info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
  • debug:用于开发DEBUG的,关键逻辑里面的运行时数据;
  • trace:最详细的信息,一般这些信息只记录到日志文件中

2、打印方法的入参和出参

只需要能快速定位问题的有效日志

3、选择合适的日志格式

如打印时间戳精确到毫秒级别

4、异步输出日志

减少IO

  • 日志最终会输出到文件或者其它输出流中的,IO性能会有要求的。如果异步,就可以显著提升IO性能。
  • 除非有特殊要求,要不然建议使用异步的方式来输出日志。以logback为例吧,要配置异步很简单,使用AsyncAppender就行
<appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="ASYNC"/>
</appender>

5、if...else 每个分支开始尽量打印日志

6、日志级别低,进行日志开关判断

User user = new User(666L"公众号""捡田螺的小男孩");  
if (log.isDebugEnabled()) {  
    log.debug("userId is: {}", user.getId());  
}

7、使用框架的日志工具

方便统一日志

8、使用参数占位{},而不是+

9、try-catch异常使用日志输出

不使用e.printStackTrace()
原因:

  • e.printStackTrace()打印出的堆栈日志跟业务代码日志是交错混合在一起的,通常排查异常日志不太方便。
  • e.printStackTrace()语句产生的字符串记录的是堆栈信息,如果信息太长太多,字符串常量池所在的内存块没有空间了,即内存满了,那么,用户的请求就卡住

10、异常日志打印全部信息

如:


try {
    //业务代码处理catch (Exception e) {
    // 错误
    LOG.error('你的程序有异常啦', e);
} 

11、不要记录了异常又抛出异常


log.error("IO exception", e);
throw new MyException(e);
  • 这样实现的话,通常会把栈信息打印两次。这是因为捕获了MyException异常的地方,还会再打印一次。
  • 这样的日志记录,或者包装后再抛出去,不要同时使用!否则你的日志看起来会让人很迷惑