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

摘要:
打印日志,要注意下面4点。使用INFO、WARN级别来记录业务日志行为信息时,一定要控制输出量,以免磁盘空间不足,同时要为日志文件设置合理的生命周期,及时清理过期的日志。参考资料:《码出高效Java开发手册》推荐阅读1.SpringBoot系列-日志配置基础篇2.SpringBoot集成JWT实现权限认证3.一分钟带你了解JWT认证!

打印日志,要注意下面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碎碎念公众号

免责声明:文章转载自《Java中打印日志,这4点很重要!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇json-server配置模拟数据fatal error C1083: 无法打开包括文件:“stddef.h”: No such file or directory下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Idea常用插件整合

官方网站:https://plugins.jetbrains.com/plugin/228-sql-query-plugin6.IdeaVim基于IntelliJ的Vim仿真插件。注意:如果打开WebInspector,那么CSS/JavaScript同步和元素高亮显示不起作用“pluginisdebuggingthistab”信息栏的可用性问题官方网站:h...

如何在linux下安装idea

[通过正式安装包安装]http://www.jetbrains.com/在官方网站上下载相应版本。终极旗舰社区版本,将其解压缩到本地对应目录,然后执行/idea.sh命令。安装后,可以在启动程序中找到创意图标。...

PLSQL操作Oracle创建用户和表(含创建用户名和密码)

1》 打开PLSQL,填写用户名和密码,为数据库选择ORCL2,成功登录后可以在界面顶部看到以下信息system@ORCL这意味着用户系统处于登录状态。菜单栏中的会话可以登录和注销。...

antd中,popover 不同情境下设置不同背景图,无法设置className的情况

于是就想通过设置不同的status值来添加不同的className,以设置.ant-popover-inner的样式来设置背景图,当然,这样做有一个不完美的就是不能一步到位的全部改变,需要手动更改.ant-popover-placement-bottom˃.ant-popover-content˃.ant-popover-arrow来替换那个角角的值。问题就...

jquery跨域请求数据

Jquery跨域请求数据Jquery跨请求数据。事实上,这很容易。请遵循以下步骤:首先,编写js,通过get获取远程数据。请注意,回调参数应添加在链接之后,这意味着将回调函数地址传输到远程页面。',{params},函数cb{alert;alert;},'json');第二:编写处理程序。publicvoidProcessRequest{context.Re...

【Lua】table表删除指定元素 (转)

删除表时,会找到一个表。remove(table,idx)方法用于根据表中的索引进行删除。当前要求是根据值进行删除。quick-x中还有一个相应的表方法封装:1.根据表中的值删除--删除表中的指定元素(而不是根据索引)--@paramarray要操作的容器--@paramvalue删除值--@paramremo...