您的位置:首页 > 编程语言 > Java开发

关于Java日志的注意事项

2017-11-29 10:23 393 查看


关于Java日志的注意事项


1. 使用抽象日志框架

尽量使用slf4j或commons-logging等抽象日志框架,而不是具体的 logging(jdk 自带的)、log4j1、log4j2、logback等具体实现关键框架。这样可以在保证不修改代码的情况下,很方便的实现底层日志框架的更换。


2. 消除isDebugEnabled()

尽量使用slf4j,而不是commons-logging,推荐使用下面slf4j提供的第三种写法。从可读性和系统效率来说, slf4j比log4j都要优秀(log4j涉及到字符串连接和toString()方法的调用). 这里的{}带来的另一个好处, 我们在尽量不损失性能的情况,
不必为了不同的日志输出级别, 而加上类似isDebugEnabled()判断.
第一种写法:
log.debug("Found " + records.keySet().toString() + " records matching filter: '" + filter + "'");
缺点:当日志级别提高到debug以上时,这条日志不会输出,但是records.keySet().toString()仍然会进行,字符串仍然会进行拼接

第二种写法:
if(log.isDebugEnabled())
log.debug("Found " + records.keySet().toString() + " records matching filter: '" + filter + "'");
缺点:虽然没有第一种写法的缺点,但是不专注于业务逻辑

第三种写法(推荐使用这种写法):
log.debug("Found {} records matching filter: '{}'", records.keySet().toString(), filter);


3. 正确认识日志级别

不同的日志框架有不同的日志级别,但主要可以分为3类:
用于显示调试信息,代表:debug,一般用于开发阶段,给开发人员看的
用于显示正常信息,代表:info,一般用于线上正式环境,给运营和运维人员看的
用于输出错误信息,代表:error,可以用于所有环境,给开发或测试人员看的

slf4j的日志级别如下表所示:
调试信息正常信息错误信息
trace、debuginfowarn、error
消息的中重要程度从左往右递进,常用的主要是debug、info和error这3个级别,也可以根据需要微调为trace和warn。

trace主要用来打印一些“踪迹”,如函数间的相互调用关系,函数的参数和返回值等现场信息;

warn主要用来打印一些“警告”,如函数参数传入错误等,不会造成系统严重错误的警告信息。

区分warn和error:
人为错误用warn:比如多个if条件,由于输入的不同,当进入到某个if分支时,为了不让程序继续进行而抛出异常,这里可以用warn记录。
系统错误用error:比如系统rpc远程调用发生错误那不到数据,应该用error记录。


参考:

[1] 正确使用日志的10个技巧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: