0%

Java打印日志最佳实践

一、只记录DEBUG,INFO和ERROR级别日志

只记录DEBUG,INFO和ERROR级别的日志信息,DEBUG级别日志记录“调试信息”,INFO级别日志记录“一般信息”,ERROR级别日志记录“异常信息”,这3个级别的日志记录已经能够充分包含关键有价值的信息;如果再记录其他级别的日志信息,一方面,这些日志信息的价值度不是很高(DEBUG,INFO和ERROR这3个级别的日志信息已经能够充分包含关键有价值的信息),另外一方面,过多的日志信息会降低可读性。
需要特别强调的是,DEBUG级别的日志记录非常重要,它与INFO级别的日志记录和ERROR级别的日志记录一起,能够充分包含关键有价值的信息,三者缺一不可。
举例子说明DEBUG级别日志记录的重要性,我们常常使用第三方库(比如Spring,Mybatis等),在使用这些第三方库的过程中,如果遇到问题,我们往往可以通过设置“将DEBUG级别的日志记录显式打印出来”,从而获得排查问题的线索。因此,如果某些第三方库没有记录DEBUG级别的日志信息,那么它们的易用性就会受到很大的损害。

二、只在调试模式下显式打印DEBUG级别日志信息

“一、只记录DEBUG,INFO和ERROR级别日志”中介绍到需要记录DEBUG,INFO和ERROR级别的日志信息,但是,需要注意的是,在一般模式下,只显式打印INFO和ERROR级别的日志信息,而不显式打印DEBUG级别的日志信息。这是因为在一般模式下,DEBUG级别的日志信息并没有很大价值,如果显式打印会降低可读性,只有在调试模式时,才需要将DEBUG,INFO和ERROR这3个级别的日志信息一起同时显式打印。

三、日志记录内容:日志级别,时间,地点,人物,事件

3.1、概念

日志级别:根据“一、只记录DEBUG,INFO和ERROR级别日志”,日志级别可取值有“DEBUG,INFO和ERROR”
时间:日志记录行为发生时间
地点:日志记录行为发生时所处类,根据具体情况可取“全限定类类名”或者“简单类类名”
人物:进行日志记录行为的当前线程的线程名称
事件:使用日志进行记录的事件内容

3.2、举例说明

选择使用Log4J日志框架,使用的Log4J日志框架配置文件内容如下:

1
2
3
4
5
6
7
log4j.rootLogger=INFO, file

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logging.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%p %d{yyyy-MM-dd HH:mm:ss} %c %t - %m%n

现有如下类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.dslztx;

import org.apache.log4j.Logger;

public class Main {
private static final Logger LOG = Logger.getLogger(Main.class);

public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
LOG.info("Run Thread");
}
}, "ThreadName").start();
}
}

运行以上类main方法之后,日志文件内容如下:

1
INFO 2016-08-13 19:18:24 com.dslztx.Main ThreadName - Run Thread

四、日志对人必须具有可读性

日志对人必须具有可读性,这个“人”一般是指具有使用Linux下基本的文本处理命令(比如grep,sed,cut,tail等命令)能力的人。


参考文献: [1]https://blog.log4d.com/2015/10/how-to-log/ [2]http://dev.splunk.com/view/logging-best-practices/SP-CAAADP6
您的支持将鼓励我继续分享!