log4j2是log4j的最新版,现在已经有很多公司在使用了。log4j2和log4j的优缺点对比,请自行百度。
上一篇笔记讲了关于log4j的使用。这篇笔记主要讲解log4j2的使用。
一、maven依赖的配置
log4j-core这个依赖加进来就有log4j-core和log4j-api这两个jar包了,一般开发情况下有这两个jar就可以。
但是,笔者发现spring和struts2的日志不输出。网上找了下,发现还需要log4j-web和log4j-jcl这两个jar包,因此一共需要导4个jar包。

下面为maven依赖xml代码
<!-- 如果采用log4j2的话,需要下面3个依赖 -->
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jcl -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.8.2</version>
</dependency>19
1
<!-- 如果采用log4j2的话,需要下面3个依赖 --> 2
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->3
<dependency>4
<groupId>org.apache.logging.log4j</groupId>5
<artifactId>log4j-core</artifactId>6
<version>2.8.2</version>7
</dependency>8
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web -->9
<dependency>10
<groupId>org.apache.logging.log4j</groupId>11
<artifactId>log4j-web</artifactId>12
<version>2.8.2</version>13
</dependency>14
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jcl -->15
<dependency>16
<groupId>org.apache.logging.log4j</groupId>17
<artifactId>log4j-jcl</artifactId>18
<version>2.8.2</version>19
</dependency>二、配置log4j2.xml
log4j2的配置方式有多种,比如xml、json等。这里用的xml配置,我们需要把log4j2.xml这个文件放到src下。注意这个文件名必须为log4j2.xml。xml配置的方式其实不难,只要会用老版log4j的人都能看懂一点。
配置的话可以分为2步:
(1)配置Appenders,就是配置输出端
(2)配置Loggers,这个就是配置比如指定包的日志级别以及Root的配置。
注意点:定义好的输出端一定要引用才能生效
(1)直接贴代码
<?xml version="1.0" encoding="UTF-8"?>
<!--
status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出。
因此我们直接设置成OFF
-->
<Configuration status="OFF">
<!-- 配置输出端 -->
<Appenders>
<!-- 输出到控制台 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-level]%d{HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" />
</Console>
<!-- 输出到文件 -->
<!--
name: 输出端的名字
fileName: 指定当前日志文件的位置和文件名称
filePattern: 指定当发生自动封存日志时,文件的转移和重命名规则
这个filePatten结合下面的TimeBasedTriggeringPolicy一起使用,可以实现控制日志按天生成文件.
自动封存日志的策略可以设置时间策略和文件大小策略(见下面的Policies配置)
时间策略:
文件名_%d{yyyy-MM-dd}_%i.log 这里%d表示自动封存日志的单位是天
如果下面的TimeBasedTriggeringPolicy的interval设为1,
表示每天自动封存日志一次;那么就是一天生成一个文件。
文件大小策略:
如果你设置了SizeBasedTriggeringPolicy的size的话,
超过了这个size就会再生成一个文件,这里的%i用来区分的
%d{yyyy-MM-dd}会自动替代为日期,如2017-06-30
-->
<RollingFile name="RollingFileInfo" fileName="D:/log/tax_info.log"
filePattern="D:/log/%d{yyyy-MM-dd}/tax_info_%d{yyyy-MM-dd}_%i.log">
<!-- 只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<!-- 输出的格式 -->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<!--
Policies:自动封存日志策略,表示日志什么时候应该产生新日志,
可以有时间策略和大小策略等,并且:只有满足一个策略,就好生成一个新的文件。
这里使用的是时间和大小都使用了,每隔1天产生新的日志文件
如果果今天的文件大小到了设定的size,则会新生成一个文件,上面的%i就表示今天的第几个文件
-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="20MB" />
</Policies>
<!--
DefaultRolloverStrategy属性如不设置,
则默认为最多同一文件夹下7个文件,这里设置了20
-->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<!-- 配置Loggers -->
<Loggers>
<!--
Logger: 用于指定部分包的日志级别
日志级别局部的会覆盖全局的
比如这里hibernate的级别设为debug,而控制台没有设级别,那么控制台会打印debug级别的日志
而输出到文件这个输出端设置了info级别,那么hibernate的debug级别的日志还是看不了。
所以最终输出的级别和输出端设置的级别是有关系的。
name: 包名
level:日志级别
additivity:是否冒泡,既在当前logger的输出端输出日志后
是否需要在父输出端上输出该日志,默认为 true。
如果设为false,则必须配置AppendRef。
-->
<Logger name="org.hibernate" level="debug" additivity="true" />
<!-- 这个root是配置全局日志级别和输出端功能和老版的log4j中根的配置是一样的 -->
<Root level="info">
<!-- 这里引用上面定义的输出端,千万不要漏了。 -->
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFileInfo" />
</Root>
</Loggers>
</Configuration> x
1
2
3
<!-- 4
status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出。5
因此我们直接设置成OFF6
-->7
<Configuration status="OFF">8
9
<!-- 配置输出端 -->10
<Appenders>11
<!-- 输出到控制台 -->12
<Console name="Console" target="SYSTEM_OUT">13
<PatternLayout pattern="[%-level]%d{HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" />14
</Console>15
16
<!-- 输出到文件 -->17
<!-- 18
name: 输出端的名字19
fileName: 指定当前日志文件的位置和文件名称20
filePattern: 指定当发生自动封存日志时,文件的转移和重命名规则21
这个filePatten结合下面的TimeBasedTriggeringPolicy一起使用,可以实现控制日志按天生成文件.22
自动封存日志的策略可以设置时间策略和文件大小策略(见下面的Policies配置)23
时间策略:24
文件名_%d{yyyy-MM-dd}_%i.log 这里%d表示自动封存日志的单位是天25
如果下面的TimeBasedTriggeringPolicy的interval设为1,26
表示每天自动封存日志一次;那么就是一天生成一个文件。27
文件大小策略:28
如果你设置了SizeBasedTriggeringPolicy的size的话,29
超过了这个size就会再生成一个文件,这里的%i用来区分的30
%d{yyyy-MM-dd}会自动替代为日期,如2017-06-3031
-->32
<RollingFile name="RollingFileInfo" fileName="D:/log/tax_info.log"33
filePattern="D:/log/%d{yyyy-MM-dd}/tax_info_%d{yyyy-MM-dd}_%i.log">34
<!-- 只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->35
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />36
<!-- 输出的格式 -->37
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />38
<!-- 39
Policies:自动封存日志策略,表示日志什么时候应该产生新日志,40
可以有时间策略和大小策略等,并且:只有满足一个策略,就好生成一个新的文件。41
这里使用的是时间和大小都使用了,每隔1天产生新的日志文件42
如果果今天的文件大小到了设定的size,则会新生成一个文件,上面的%i就表示今天的第几个文件43
-->44
<Policies>45
<TimeBasedTriggeringPolicy interval="1" />46
<SizeBasedTriggeringPolicy size="20MB" />47
</Policies>48
<!-- 49
DefaultRolloverStrategy属性如不设置,50
则默认为最多同一文件夹下7个文件,这里设置了2051
-->52
<DefaultRolloverStrategy max="20"/>53
</RollingFile>54
</Appenders>55
56
<!-- 配置Loggers -->57
<Loggers>58
<!-- 59
Logger: 用于指定部分包的日志级别60
日志级别局部的会覆盖全局的61
比如这里hibernate的级别设为debug,而控制台没有设级别,那么控制台会打印debug级别的日志62
而输出到文件这个输出端设置了info级别,那么hibernate的debug级别的日志还是看不了。63
所以最终输出的级别和输出端设置的级别是有关系的。64
name: 包名65
level:日志级别66
additivity:是否冒泡,既在当前logger的输出端输出日志后67
是否需要在父输出端上输出该日志,默认为 true。68
如果设为false,则必须配置AppendRef。69
-->70
<Logger name="org.hibernate" level="debug" additivity="true" />71
72
<!-- 这个root是配置全局日志级别和输出端功能和老版的log4j中根的配置是一样的 -->73
<Root level="info">74
<!-- 这里引用上面定义的输出端,千万不要漏了。 -->75
<AppenderRef ref="Console" />76
<AppenderRef ref="RollingFileInfo" />77
</Root>78
</Loggers>79
80
</Configuration> (2)这里重点解释下 Logger中的additivity属性
这个属性在我看了网上好多人的博客上的解释的情况下,最后确定了他的具体作用。
additivity表示是否需要将当前Logger的日志打印在父级的输出端上,默认是true,即默认在父级输出端上打印。
这个Logger的父级就是root了。下面进行各种情况的分析。
<1>. 上文中的Logger没有配置输出端,additivity为true;那么这个Logger的日志是在他父级(root)的输出端输出。
所以在控制台可以看到debug级别的日志。
<2>. 如果Logger没有配置输出端,additivity为false;那么他不会在他的父级的输出端输出,所以这个日志就不会输出。
这会造成配置的这个Logger的包及子包下的所有的日志都不会输出,这个是个很危险的配置。
<3>. 如果Logger配置在控制台输出,additivity为true;而root的输出端也有控制台,那么这个日志会打印2遍。
<4>. 如果Logger配置在控制台输出,additivity为false;那么不会在root的输出端输出,这个日志只会打印1遍。
通过这4种情况的分析:个人认为最佳配置为,Logger不配置输出端,additivity设为true。
让Logger使用root的输出端输出。这样配置简单,也不会出现不打印或者多打印日志的问题。
<Logger name="com.test" level="debug" additivity="true" />
参考链接:http://blog.csdn.net/junshao90/article/details/8364812
(3)生成的日志文件的效果图:

三、java代码中使用log4j2打印日志
public static void main(String[] args) {
Logger logger = LogManager.getLogger(TestSpring.class);
logger.debug("这是debug");
logger.info("这是Info");
logger.error("这是error");
}1
public static void main(String[] args) {2
Logger logger = LogManager.getLogger(TestSpring.class); 3
logger.debug("这是debug");4
logger.info("这是Info");5
logger.error("这是error");6
}