文章目录
- 一、不要使用e.printStackTrace()
- 二、不要使用log.error(e.getMessage())
- 三、不要在日志打印时进行字符串拼接
先说结论:建议使用log.error(String msg, Throwable t)方式打印错误日志,最好在加上try中的各种参数的信息方便排查
java">@Slf4j
public class Test {try {...} catch (Exception e) {log.error("数据异常!",e);}try {...} catch (Exception e) {log.error("数据异常,param:{}",id,e);}
}
以下为在项目中错误的打印异常日志的方式
一、不要使用e.printStackTrace()
java">try {...
} catch (Exception e) {e.printStackTrace()log.error("数据异常!");
}
当try语句中出现异常时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化。
e.printStackTrace()的作用是打印异常堆栈信息,在命令行打印异常信息以及在程序中出错的位置及原因(代码行号)。
原因:
- e.printStackTrace()打印出的堆栈日志跟业务代码日志是交错混合在一起的,通常排查异常日志不太方便。
- e.printStackTrace()语句产生的字符串记录的是堆栈信息,如果信息太长太多加上频繁的调用e.printStackTrace(),会生成大量临时字符串对象,可能导致 Java 堆内存(Heap Memory)中的年轻代(Young Generation)快速填满,从而触发频繁的垃圾回收(GC)。在极端情况下,如果生成的字符串对象太多且无法及时回收,可能会导致 OutOfMemoryError。
二、不要使用log.error(e.getMessage())
java">try {...
} catch (Exception e) {log.error(e.getMessage());
}
不推荐以上这种写法的原因是e.getMessage()可能为空,会导致看不到任何错误信息。
在日志输出时,字符串变量之间的拼接使用占位符的方式。
原因:
因为 String 字符串的拼接会使用 StringBuilder 的 append()方式,有一定的性能损耗。使用占位符仅是替换动作,可以有效提升性能。
三、不要在日志打印时进行字符串拼接
在日志输出时,字符串变量之间的拼接使用占位符的方式。
java">try {...
} catch (Exception e) {//log.error("id:" + id + ",name:" + name);log.error("系统异常!id:{},name:{}",id ,name,e);
}
原因:
因为使用占位符仅是替换动作而并非是字符串的拼接,可以有效提升性能。