Log4j2 快速使用
log4j 2.x 版本提供了更多的功能和更加简便的使用方式,和1.X版本相比使用过程有些不同,其中比较大的改动是取消了 log4j.propelog配置文件,使用 xml,json,jsn 格式作为配置文件,同时修改了部分对象的调用过程,如 Logger 对象等,以下是Log4j2 的快速使用过程:
在官方下载log4j 2,下载地址:https://logging.apache.org/log4j/2.x/download.html
将以下的 jar 包导入到项目依赖 lib 中:
1
log4j-core-xx.jar
2
log4j-api-xx.jar
也可以通过 在 Maven 项目的 pom.xml 引入:
1
<dependencies>
2
<dependency>
3
<groupId>org.apache.logging.log4j</groupId>
4
<artifactId>log4j-api</artifactId>
5
<version>2.x</version>
6
</dependency>
7
<dependency>
8
<groupId>org.apache.logging.log4j</groupId>
9
<artifactId>log4j-core</artifactId>
10
<version>2.x</version>
11
</dependency>
12
</dependencies>
之后在项目工程的 src 目录下创建一个 log4j2.xml ,里面写入:
1
2
<Configuration status="WARN">
3
<Appenders>
4
<Console name="Console" target="SYSTEM_OUT">
5
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
6
</Console>
7
</Appenders>
8
<Loggers>
9
<Root level="debug">
10
<AppenderRef ref="Console" />
11
</Root>
12
</Loggers>
13
</Configuration>
之后在工程里就可以使用 log4j 记录日志了,以下是简单的测试代码:
1
import org.apache.logging.log4j.LogManager;
2
import org.apache.logging.log4j.Logger;
3
4
public class TestLog4j {
5
private static final Logger log = LogManager.getLogger();
6
public static void main(String[] args){
7
log.debug("test debug message"); //Logger的各种记录方法;
8
log.info("test info message");
9
log.warn("test warn message");
10
log.error("test error message");
11
log.fatal("test fatal message");
12
}
13
}
以上代码在控制台输出
1
20:35:28.179 [main] DEBUG demo.TestLog4j - test debug message
2
20:35:28.181 [main] INFO demo.TestLog4j - test info message
3
20:35:28.181 [main] WARN demo.TestLog4j - test warn message
4
20:35:28.181 [main] ERROR demo.TestLog4j - test error message
5
20:35:28.181 [main] FATAL demo.TestLog4j - test fatal message
以上就是 Log4j2 的快速使用过程,以下说明各个部分的使用细节;
日志记录的级别
log4j 的日志记录级别由低到高如下表:
这些级别的等级排布:trace<debug<info<warn<error<fatal;
这些级别之间的包含的关系,比如将日志级别设置为 debug,那么大于等于这个级别的日志都会输出,即输出 debug,info,warn,error,fatal 等级的日志;
配置文件说明
一般会把配置文件命名为 log4j2.xml ,同时放置在项目src的目录下,关于log4j2调用配置文件的顺序,可以参考官方说明:
一个典型的配置文件如下:
1
2
<Configuration status="WARN">
3
<Appenders>
4
<Console name="myConsole" target="SYSTEM_OUT">
5
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
6
</Console>
7
</Appenders>
8
<Loggers>
9
<Root level="debug">
10
<AppenderRef ref="myConsole" />
11
</Root>
12
</Loggers>
13
</Configuration>
这里补充Log4j的3个主要的对象介绍:
-
Logger: 负责捕获记录信息;
-
Appender : 负责发布日志信息,同时决定日志的发送目的地;
-
Layouter: 负责格式化不同风格的日志信息。
<Configuration>
log4j2.xml 的根节点,内部包含<Appends>,<Loggers>等多种节点;status属性指定默认的优先级(即在内部logger没有指定优先级的情况下,为其指定的优先级);可以添加一个 monitorInterval 指定每隔多少秒重新读取配置文件,可以在不重启的情况下读取该配置文件;
<Appenders>
定义各种 Appender 输出器,包含各个appender,有各种种类的appender标签,其中有2种比较常用的标签:<Console>,<File>,分别代表控制台输出、文件输出;
<Console>
控制台输出类型appender,其中 name属性为该appender的标识名,traget指定输出目的地;
<PatternLayout>
用于appender输出的格式化,pattern属性为一个输出格式的字符串;
如 “ %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n“ 中的含义如下:
输出以下格式的文本:120:35:28.181 [main] INFO demo.TestLog4j - test info message
以下是一个在debug常用的格式字符串,用于输出debug的详细信息:"%d{yyyy.MM.dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %F:%M(line:%L) - %msg%n"输出格式如下:12017.07.27 14:30:21.889 [main] DEBUG demo.TestLog4j TestLog4j.java:main(line:17) - test debug message
<Loggers>
定义各种loggers,包含<Root>和<Logger>2种标签,其中<Root>为根logger,即在代码中 LogManager.getlogger() 没有指定参数的情况下委派的默认logger,这些logger会包含一个<AppenderRef >用于指定该 logger 的 appender,在其 ref 属性表示该 append的 name 标识;
指定Logger
在代码 Logger logger = LogManager.getLogger() 中,如果不指定Logger name,那么lg4j会直接调用<Root>的Logger,在使用 %logger 会输出所调用类的class名,如以上示例例子会输出“demo.Log4jTest”,如果要指定一个 Logger 来处理该日志收集,可以如下设置:
代码中:
1
private static final Logger log = LogManager.getLogger("mylogger");
2
public static void main(String[] args){
3
log.debug("test debug message");
4
log.info("test info message");
5
log.warn("test warn message");
6
log.error("test error message");
7
log.fatal("test fatal message");
8
}
log4j2.xml中:
1
<Configuration status="WARN" monitorInterval="300">
2
<Appenders>
3
<Console name="myConsole" target="SYSTEM_OUT">
4
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
5
</Console>
6
</Appenders>
7
<Loggers>
8
<Logger name="mylogger" level="debug" additivity="false">
9
<AppenderRef ref="myConsole" />
10
</Logger>
11
<Root level="debug">
12
<AppenderRef ref="myConsole" />
13
</Root>
14
</Loggers>
15
</Configuration>
<Logger> 中 additivity="false" 表示在该logger中输出的日志不会再延伸到父层 logger,这里如果改为true,则会延伸到Root Logger,即Root Logger的配置也会输出一次。
指定Appender
通过Appender可以指定输出的目的地和格式,常用的有输出到控制台和文件,即<Console><File>,
以下示例者两种输出形式;
1
<Configuration status="WARN" monitorInterval="300">
2
<Appenders>
3
<Console name="Console" target="SYSTEM_OUT">
4
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
5
</Console>
6
<File name="myfile" fileName="D:/logs/app.log">
7
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
8
</File>
9
</Appenders>
10
<Loggers>
11
<Logger name="mylog" level="debug" additivity="false">
12
<AppenderRef ref="myfile" />
13
</Logger>
14
<Root level="error">
15
<AppenderRef ref="Console" />
16
</Root>
17
</Loggers>
18
</Configuration>
更多关于 Log4j2 的用法和概念参见官方的说明文档:https://logging.apache.org/log4j/2.x/index.html
本文也是参考该官方文档总结的;