Apache Log4j 2是日志框架Log4j的升级,它比其前身Log4j 1.x提供了重要的改进,并且参考了Logback中许多有用的改进,同时修复了Logback的一些固有问题。
本文介绍Log4j2的常用功能,给出一个完整的log4j2.xml配置文件,作为工作开发中常用的日志配置参考。
上一篇文章:Log4j2+Maven基本使用入门
一、测试代码
为了演示Log4j2的功能,创建如下的测试类:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2Test {
private static Logger LOG = LogManager.getLogger(Log4j2Test.class);
public static void main(String[] args) throws Exception {
// 一直打印日志,用于测试Log4j2功能
while (true) {
logAll();
}
}
// 打印各种级别的日志用于测试
public static void logAll() throws Exception {
LOG.trace("trace level log");
LOG.debug("debug level log");
LOG.info("info level log");
LOG.error("error level log");
LOG.fatal("fatal level log");
// 设置休眠时间(单位ms),控制日志打印速度
Thread.sleep(3000);
}
}
启动应用,输出结果如下图所示:
二、日志级别
Log4j2共有8种日志级别,按照优先级从小到大排序:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
当日志级别设置为某一级别时,则会打印大于等于该级别的日志,比如日志级别设置为ERROR,则会打印ERROR、FATAL级别的日志。
ALL会把所有级别的日志打印出来,OFF不会打印任何级别的日志,所以严格来讲只有6种日志级别。
三、进一步介绍配置文件
添加自定义Appender:
<Appenders>
<File name="File" fileName="test.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</File>
</Appenders>
这里增加了一个类型为File的Appender,name为File,FileName为test.log,表示日志会打印到test.log文件。
添加自定义Logger:
<Loggers>
<Logger name="com.rickie" level="ERROR" additivity="true">
<AppenderRef ref="File" />
</Logger>
</Loggers>
这里增加了一个Logger,需要配合上面的Appender使用,name为Log4j2Test的包路径com.rickie,level日志级别为EEROR,
AppenderRef指向了上面新增的名称为File的Appender,表示Log4j2Test的ERROR和FATAL级别的日志会打印到test.log。
test.log文件内容如下所示:
同时additivity设置为true,会将当前的Logger特性会传递给Root,即上述的日志不仅会输出到test.log文件,也会输出到Root指向的控制台。如果想避免重复的日志,可以设置additivity="false"。
Loggers节点,常见的有两种:Root和Logger。
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出。
每个配置都必须有一个根记录器Root。如果未配置,则将使用默认根LoggerConfig,其级别为ERROR且附加了Console appender。根记录器和其他记录器之间的主要区别是:1.根记录器没有name属性。2.根记录器不支持additivity属性,因为它没有父级。
- level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
- AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender。
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
使用Logger元素必须有一个name属性,root logger不用name元属性
每个Logger可以使用TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF之一配置级别。如果未指定级别,则默认为ERROR。可以为additivity属性分配值true或false。如果省略该属性,则将使用默认值true。
Logger还可以配置一个或多个AppenderRef属性。引用的每个appender将与指定的Logger关联。如果在Logger上配置了多个appender,则在处理日志记录事件时会调用每个appender。
- name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。一般是项目包名或者框架的包名,比如:com.jourwon,org.springframework。
- level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
- AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root。如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
示例项目下载地址:
https://gitee.com/entlib/log4j-hello