代码中日志记录的正确姿势

来源https://juejin.im/post/5b9871895188255c57212459

几个错误的打日志方式

  1. 不要使用 System.out.print..
    输出日志的时候只能通过日志框架来输出日志,而不能使用 System.out.print.. 来打印日志,这个只会打印到 tomcat 控制台,而不会记录到日志文件中,不方便管理日志,如果通过服务形式启动把日志丢弃了那更是找不到日志了。
  1. 不要使用 e.printStackTrace()
    首先来看看它的源码:
public void printStackTrace() {
    printStackTrace(System.err);
}

复制代码它其实也是利用 System.err 输出到了 tomcat 控制台。

  1. 不要抛出异常后又输出日志
    如捕获异常后又抛出了自定义业务异常,此时无需记录错误日志,由最终捕获方进行异常处理。不能又抛出异常,又打印错误日志,不然会造成重复输出日志。
try {
    // ...
} catch (Exception e) {
    // 错误
    LOG.error("xxx", e);
    throw new RuntimeException();
}
  1. 不要使用具体的日志实现类
InterfaceImpl interface = new InterfaceImpl();

这段代码大家都看得懂吧?应该面向接口的对象编程,而不是面向实现,这也是软件设计模式的原则,正确的做法应该是。

Interface interface = new InterfaceImpl();

日志框架里面也是如此,上面也说了,日志有门面接口,有具体实现的实现框架,所以大家不要面向实现编程。

  1. 没有输出全部错误信息
    看以下代码,这样不会记录详细的堆栈异常信息,只会记录错误基本描述信息,不利于排查问题。
try {
    // ...
} catch (Exception e) {
    // 错误
    LOG.error('XX 发生异常', e.getMessage());
    // 正确
    LOG.error('XX 发生异常', e);
}  
  1. 不要使用错误的日志级别
    曾经在线上定位一个问题,同事自信地和我说:明明输出了日志啊,为什么找不到...,后来我去看了下他的代码,是这样的:
try {
    // ...
} catch (Exception e) {
    // 错误
    LOG.info("XX 发生异常...", e);
}

大家看出了什么问题吗?用 info 记录 error 日志,日志输出到了 info 日志文件中了,同事拼命地在 error 错误日志文件里面找怎么能找到呢?

  1. 不要在千层循环中打印日志
    这个是什么意思,如果你的框架使用了性能不高的 Log4j 框架,那就不要在上千个 for 循环中打印日志,这样可能会拖垮你的应用程序,如果你的程序响应时间变慢,那要考虑是不是日志打印的过多了。
for(int i=0; i<2000; i++){
    LOG.info("XX");
}

最好的办法是在循环中记录要点,在循环外面总结打印出来。

  1. 禁止在线上环境开启 debug
    这是最后一点,也是最重要的一点。
    一是因为项目本身 debug 日志太多,二是各种框架中也大量使用 debug 的日志,线上开启 debug 不久就会打满磁盘,影响业务系统的正常运行。

你可能感兴趣的:(代码中日志记录的正确姿势)