打印日志,要注意下面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值,没有实际意义。

最新文章

  1. 火币网api的nodejs实现
  2. java的继承
  3. 选项卡 tab切换
  4. linux nginx 配置ssl证书访问
  5. linux修改文件权限和用户组管理小结
  6. LA4329 Ping pong 树状数组
  7. java课程设计---团体
  8. 数据分析之pandas教程-----概念篇
  9. alpha-咸鱼冲刺day5
  10. Android学习之Animation(一)
  11. iOS----------上传遇到的问题
  12. 同步Name到Comment 及 同步 Comment 到Name
  13. LeetCode数组查找问题
  14. UCloud 机房的网络搭建(计蒜客初赛第五场)
  15. [20171031]rman xxx Failure.txt
  16. python箱型图
  17. [树链剖分]hihocoder1883
  18. 中国队再创佳绩,IOI2018喜获四金
  19. Spring Boot 日志配置
  20. 【转】Dubbo声明式缓存

热门文章

  1. 长乐培训Day3
  2. PAT(B) 1033 旧键盘打字(C) 字符
  3. leetcode动态规划笔记三---单序列型
  4. Android去评分,分享
  5. Oracle随笔之用拆分后的列数据关联表查询
  6. 在论坛中出现的比较难的sql问题:30(row_number函数 物料组合问题)
  7. 使用Harbor搭建Docker私有镜像仓库
  8. SpringMVC源码解读
  9. 【转载】 Asp.Net安全之防止脚本入
  10. zabbix4.2的yum+mariadb方式部署安装