几个错误的打日志方式
-
不要使用 System.out.print..
输出日志的时候只能通过日志框架来输出日志,而不能使用 System.out.print.. 来打印日志,这个只会打印到 tomcat 控制台,而不会记录到日志文件中,不方便管理日志,如果通过服务形式启动把日志丢弃了那更是找不到日志了。
-
不要使用 e.printStackTrace()
首先来看看它的源码:
public void printStackTrace() {
printStackTrace(System.err);
}
复制代码它其实也是利用 System.err 输出到了 tomcat 控制台。
-
不要抛出异常后又输出日志
如捕获异常后又抛出了自定义业务异常,此时无需记录错误日志,由最终捕获方进行异常处理。不能又抛出异常,又打印错误日志,不然会造成重复输出日志。
try {
// ...
} catch (Exception e) {
// 错误
LOG.error("xxx", e);
throw new RuntimeException();
}
- 不要使用具体的日志实现类
InterfaceImpl interface = new InterfaceImpl();
这段代码大家都看得懂吧?应该面向接口的对象编程,而不是面向实现,这也是软件设计模式的原则,正确的做法应该是。
Interface interface = new InterfaceImpl();
日志框架里面也是如此,上面也说了,日志有门面接口,有具体实现的实现框架,所以大家不要面向实现编程。
-
没有输出全部错误信息
看以下代码,这样不会记录详细的堆栈异常信息,只会记录错误基本描述信息,不利于排查问题。
try {
// ...
} catch (Exception e) {
// 错误
LOG.error('XX 发生异常', e.getMessage());
// 正确
LOG.error('XX 发生异常', e);
}
-
不要使用错误的日志级别
曾经在线上定位一个问题,同事自信地和我说:明明输出了日志啊,为什么找不到...,后来我去看了下他的代码,是这样的:
try {
// ...
} catch (Exception e) {
// 错误
LOG.info("XX 发生异常...", e);
}
大家看出了什么问题吗?用 info 记录 error 日志,日志输出到了 info 日志文件中了,同事拼命地在 error 错误日志文件里面找怎么能找到呢?
-
不要在千层循环中打印日志
这个是什么意思,如果你的框架使用了性能不高的 Log4j 框架,那就不要在上千个 for 循环中打印日志,这样可能会拖垮你的应用程序,如果你的程序响应时间变慢,那要考虑是不是日志打印的过多了。
for(int i=0; i<2000; i++){
LOG.info("XX");
}
最好的办法是在循环中记录要点,在循环外面总结打印出来。
-
禁止在线上环境开启 debug
这是最后一点,也是最重要的一点。
一是因为项目本身 debug 日志太多,二是各种框架中也大量使用 debug 的日志,线上开启 debug 不久就会打满磁盘,影响业务系统的正常运行。