Log4j 2基本使用

基本介绍

Log4j基本的jar包为log4j-core-版本.jar和log4j-api-版本.jar,一般导入这两个jar包足以满足基本使用,其他jar包的功能参考官网。

在程序中我们可以通过下面的方式获得一个logger,

1
Logger logger = LogManager.getLogger("name of logger");

其中logger_name是在配置文件中指定的,如果没有配置文件或者没有找到对应名字的logger,则会使用默认的logger: 日志级别为ERROR,输出为控制台。

重点要说明的是日志的级别以及如果配置Logger。Log4j默认有如下级别:trace, debug, info, warn, error, fatal,重要级别依次增加。当然也可以自定义级别,不过一般这些默认级别足够使用,而且也利于扩展和迁移。

  • trace一般用于记录程序进行所有的进展信息,数量一般比较多。
  • debug一般用于调试输出调试部分所需要查看的信息。
  • info一般用于输出重要的关注的信息。
  • warn一般用于输出程序可能存在潜在的问题和提示。
  • error用于输出错误信息。
  • fatal同样用于输出错误信息,一般是程序遇到致命错误需要停止,输出相关信息。

基本使用如下:

1
2
3
4
5
6
7
8
9
10
11
12
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LogTest {
private Logger logger = LogManager.getLogger(this.class.getName());

public void testLog() {
logger.trace("this is trace");
logger.info("important info");
logger.error("some error happen");
}
}

如果直接运行上面的代码,trace和info的信息将被丢弃,error及以上信息会被输出到控制台,这时Log4jD的默认配置。

配置文件

我们可以通过配置文件配置logger按照我们所需要的方式工作。配置文件可以为xml,ymal和json格式,一般放在src目录下,如log4j2-test.xml。这里我们介绍基于xml的配置文件,其他文件格式也是类似的,一个简单的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?xml version="1.0" encoding="UTF-8"?>

<configuration status="error">
<!--定义appenders-->
<appenders>
<!--appender 1-->
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%msg%xEx%n"/>
</Console>

<!--appender 2-->
<Console name="allConsole" target="SYSTEM_OUT">
<PatternLayout pattern="%msg%xEx%n"/>
</Console>

<!--appender 3-->
<File name="alllog" fileName="/Users/chenzb/Desktop/logtest/alllog.log" append="false">
<PatternLayout pattern="%msg%xEx%n"/>
</File>

<!--appender 4-->
<File name="keyinfo" fileName="/Users/chenzb/Desktop/logtest/keyinfo.log" append="true">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%msg%xEx%n"/>
</File>

<RollingFile name="rolllog" fileName="Users/chenzb/Desktop/logtest/keyinfo.log" append="true""
filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</RollingFile>
</appenders>

<!--定义logger-->
<loggers>
<!--默认logger-->
<root level="trace">
<!--这个logger的appender-->
<appender-ref ref="alllog"/>
</root>

<!--一个带名字的特定的logger-->
<logger name="suggestion" level="trace" additivity="false">
<!--这个logger的appender-->
<appender-ref ref="alllog"/>
<appender-ref ref="keyinfo"/>
<appender-ref ref="Console"/>
</logger>
</loggers>
</configuration>

标签声明这是一个配置文件。

定义appenders

首先我们定义所需要的appenders,可以声明任意数量的所需要的appenders,appender记录了日志的输出形式,输出地点,格式,级别过滤等信息。如:

常用的几种输出形式有Console(输出到控制台),File(输出到文件),RollingFile(超过size自动存为压缩文件)。

1
2
3
4
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%msg%xEx%n"/>
</Console>

这时一个输出到控制台的appender,名字是Console,我们在程序中用于通过logger名字获得logger所使用的参数即是这个参数,目的地是SYSTEM_OUT。另外我们可以通过<ThresholdFilter>定义过滤器,这里我们希望过滤掉info以下的信息,也就是onMismatch,操作是直接拒绝,info及以上的信息accept。也就是只会有info以上的信息会被输出到SYSTEM_OUT。输出的格式为可以通过定义,info,error的参数标签为%msg。更多的可以定义输出代码位置、时间、级别等信息:

1
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>

下面是另一个输出到文件的appender:

1
2
3
4
<File name="keyinfo" fileName="/Users/chenzb/Desktop/logtest/keyinfo.log" append="true">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%msg%xEx%n"/>
</File>

可以通过append属性指定是否为追加方式。

定义loggers

定义appender后,我们可以定义logger,也就是将会在程序中直接使用的logger的配置。

1
2
3
4
5
6
<logger name="suggestion" level="trace" additivity="false">
<!--这个logger的appender-->
<appender-ref ref="alllog"/>
<appender-ref ref="keyinfo"/>
<appender-ref ref="Console"/>
</logger>

这里定义了一个logger,名字为suggestion(用来在程序获得这个logger的实例),level用于制定这个logger的基本级别,additivity用来指定是否重叠输出,需要注意的是info信息由于级别高于trace,所以它同时也是trace信息,如果additivity为true,则这个info信息将会被输出两次,一次作为info信息,一次trace信息。将additivity设置为false则该信息则只会以其满足的最高级别输出一次。

对于这个logger,我们使用了三个appender,也就是这个logger所获得信息将会被输出到这个三个appender,再由appender具体根据其配置过滤以及格式等信息输出。

最终在程序我们可以通过获得该logger的实例:

1
private Logger logger = LogManager.getLogger("suggestion");

另外如果在配置文件中没有名字为”suggestion”的logger,如果定义了root logger(也就是默认logger),则会使用root logger,如果没有定义,则会使用Log4j默认配置(只输出error及以上信息到控制台)。

更多使用参考Apache Log4j官网