欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中打印日志,这4点很重要!

程序员文章站 2023-10-31 10:18:22
打印日志,要注意下面4点。 [TOC] 一、预先判断日志级别 对DEBUG、INFO级别的日志,必须使用条件输出或者使用占位符的方式打印。该约定综合考虑了程序的运行效率和日志打印需求。 先来看一个反例: 如果在某个配置了打印级别为WARN的应用中,按照上面代码打印DEBUG级别的日志,那么该日志不会 ......

目录

打印日志,要注意下面4点。

一、预先判断日志级别

对debug、info级别的日志,必须使用条件输出或者使用占位符的方式打印。该约定综合考虑了程序的运行效率和日志打印需求。

先来看一个反例:

log.debug("输入参数信息id=" + id + ",obj=" + obj);

如果在某个配置了打印级别为warn的应用中,按照上面代码打印debug级别的日志,那么该日志不会被打印,但是会执行字符串拼接操作;如果obj是一个对象,还会执行tostring()方法,白白浪费系统资源。

代码正确示例如下:

//使用条件判断形式
if (log.isdebugenabled()) {
    log.debug("输入参数信息id={}", id);
}
//使用占位符形式
log.debug("输入参数信息id={},obj={}", id, obj);

二、避免无效日志打印

生产环境禁止输出debug日志且有选择的输出info日志。
使用info、warn级别来记录业务日志行为信息时,一定要控制输出量,以免磁盘空间不足,同时要为日志文件设置合理的生命周期,及时清理过期的日志。

避免重复打印,务必在日志配置文件中设置additivity=false,示例如下:

<logger name="com.test" additivity="false">
    <level value="info" />
    <appender-ref ref="logfile" />
</logger>

additivity属性简介:

它是子logger是否继承父logger的输出源(appender)的标志位,默认情况下子logger会继承父logger的appender,也就是说子logger会在父logger的appender里输出。把additivity设为false,则子logger只会在自己的appender里输出,而不会在父logger的appender里输出。

三、区别对待错误日志

warn、error都是与错误有关的日志级别,但不要一发生错误就打印error日志,比如一些业务异常是可以通过引导重试就能恢复的,例如用户输入参数错误,在这种情况下,记录日志是为了在用户咨询时可以还原现场如果输出为error级别就表示一旦出现就需要人为介入,这显然不合理。所以,error级别只记录系统逻辑错误、异常或者违反重要的业务规则,其他错误都可以归为warn级别。

四、保证记录完整内容

日志记录的内容需要包括现场上下文信息和异常堆栈信息,所以打印时候需要注意下面两点:

1.记录异常时一定要输出异常堆栈,例如:

log.error("xxx" + e.getmessage(), e);

2.日志中如果输出对象实例,要确保实例类重写了tostring方法,否则只会打印对象的hashcode值,没有实际意义。

参考资料:《码出高效java开发手册》

推荐阅读

1.springboot系列-日志配置基础篇
2.springboot集成jwt实现权限认证
3.一分钟带你了解jwt认证!
4.springboot中如何优雅的读取yml配置文件?
5.springboot中如何灵活的实现接口数据的加解密功能?


限时领取免费java相关资料,涵盖了java、redis、mongodb、mysql、zookeeper、spring cloud、dubbo/kafka、hadoop、hbase、flink等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:

Java中打印日志,这4点很重要!