log4j2 笔记
# 05.log4j2 笔记
Log4j :log for java (java 的日志) 是 java 主流的日志框架,提供各种类型,各种存储,各种格式,多样化的日志服务
# 准备jar包
在官网下载jar包 Log4j – Download Apache Log4j™ 2 (opens new window)
解压,我们只需要里面的这2个jar包:
- log4j-api-2.x.jar
- log4j-core-2.x.jar
api的jar包是接口规范,core的jar包才是具体的实现,如果忘了可以回顾下:常见的日志框架-简单介绍 (opens new window)
我们将其放到我们代码所在的路径.
# 入门案例
在jar包所在目录里,新建测试类
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class HelloLog4j {
private static final Logger logger = LogManager.getLogger(HelloLog4j.class);
public static void main(String[] args) {
logger.error("error");
logger.warn("warn");
logger.info("Info");
logger.debug("debug");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
编译,运行:
> javac -cp "log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j.java
> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j
15:33:30.612 [main] ERROR HelloLog4j - error
2
3
4
5
可以看到只输出了error。
# 指定配置文件
我们新建一个配置文件 Log4j2.xml。Log4j2会自动加载该文件,该配置文件有点复杂,大家简单看看即可,后面会讲。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<!-- 定义日志格式 -->
<Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
<!-- 定义文件名变量 -->
<Property name="file.err.filename">log/err.log</Property>
<Property name="file.err.pattern">log/err.%i.log.gz</Property>
</Properties>
<!-- 定义Appender,即目的地 -->
<Appenders>
<!-- 定义输出到屏幕 -->
<Console name="console" target="SYSTEM_OUT">
<!-- 日志格式引用上面定义的log.pattern -->
<PatternLayout pattern="${log.pattern}" />
</Console>
<!-- 定义输出到文件,文件名引用上面定义的file.err.filename -->
<RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
<PatternLayout pattern="${log.pattern}" />
<Policies>
<!-- 根据文件大小自动切割日志 -->
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<!-- 保留最近10份 -->
<DefaultRolloverStrategy max="10" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<!-- 对info级别的日志,输出到console -->
<AppenderRef ref="console" level="info" />
<!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
<AppenderRef ref="err" level="error" />
</Root>
</Loggers>
</Configuration>
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
此时我们再次运行:
> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j
12-03 15:44:48.556 [main] ERROR HelloLog4j
error
12-03 15:44:48.558 [main] WARN HelloLog4j
warn
12-03 15:44:48.558 [main] INFO HelloLog4j
Info
2
3
4
5
6
7
8
9
可以看到输出了error,warn和INFO。并且当前目录下生成了 log文件夹,里面有err.log文件。
# 配置文件的路径和后缀
Log4j2能够在初始化期间自动寻找配置,它支持4种格式的配置文件:
- Properties — .properties
- YAML — .yaml or .yml
- JSON — .json or .jsn
- XML — .xml
并且按从高到低的加权顺序查找配置文件。例如,如果它找到一个 YAML 配置,它将停止搜索并加载它。注意,只能是这几种配置文件后缀名。
那么,Log4j2具体是怎么寻找文件的呢?
Log4j2启动时,首先检查系统属性log4j.configurationFile,如果设置了该属性,则匹配文件扩展名去加载配置文件,在启动应用时配置该参数。
我们复制一份Log4j2.xml,重命名为my.xml 修改第6行和第7行内容如下:
<Property name="file.err.filename">log/err2.log</Property>
<Property name="file.err.pattern">log/err2.%i.log.gz</Property>
2
然后运行:
> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" -Dlog4j.configurationFile="my.xml" HelloLog4j
12-03 16:13:07.626 [main] ERROR HelloLog4j
error
12-03 16:13:07.628 [main] WARN HelloLog4j
warn
12-03 16:13:07.628 [main] INFO HelloLog4j
Info
2
3
4
5
6
7
8
9
可以看到生成了err2.log 日志文件,也就是采用了我们指定的配置文件
log4j.configurationFile可以配置如上的绝对路径,也可以配置相对路径,即只配置文件名myLog4j2.xml,Log4j2会在classpath路径中查找配置文件。
如果没有设置系统属性,则在classpath路径中按照顺序查找如下4个文件:
log4j2-test.properties
log4j2-test.yaml or log4j2-test.yml
log4j2-test.json or log4j2-test.jsn
log4j2-test.xml
2
3
4
如果还找不到上面的文件,则在classpath路径中按照顺序查找如下4个文件:
log4j2.properties
log4j2.yaml or log4j2.yml
log4j2.json or log4j2.jsn
log4j2.xml
2
3
4
如果没有任何配置文件,则使用默认配置文件,这将导致日志输出到控制台;默认配置如下
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="ERROR">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
2
3
4
5
6
7
8
9
10
11
12
13
这也就是为什么我们入门案例里只输出了error
# Log4j2 日志等级
Log4j2共有8种日志级别,按照优先级从小到大排序:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
当日志级别设置为某一级别时,则会打印大于等于该级别的日志,
比如日志级别设置为ERROR, 则会打印ERROR,FATAL级别的日志。
ALL会把所有级别的日志打印出来,OFF不会打印任何级别的日志,所以严格来讲只有中间6种日志级别。
Log4j 官方建议实际实用的话,只使用四个级别,** ERROR、WARN、INFO、DEBUG。我们工作中也一般只使用这4种。**
# properties案例
有时候xml文件写起来比较麻烦,可以考虑使用properties文件,我们新建一个log4j2.properties文件
name=PropertiesConfig
# 定义变量。指定日志文件的位置和文件名称,以便记录多份日志时,直接引用
property.fileName=peterjxldemo
property.fileDir=./logs
property.filePath=${fileDir}/${fileName}.log
appenders=console, rolling
# rootLogger, 根记录器,所有记录器的父辈
# 指定根日志的级别
rootLogger.level=ALL
# 指定输出的appender引用
rootLogger.appenderRef.stdout.ref=Stdout
rootLogger.appenderRef.rolling.ref=InfoRollingFile
# console
# 指定输出源的类型与名称
appender.console.type=Console
appender.console.name=Stdout
appender.console.layout.type=PatternLayout
# 输出模板
appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
# rootLogger, 根记录器,所有记录器的父辈
# 指定根日志的级别
rootLogger.level=ALL
# 指定输出的appender引用
rootLogger.appenderRef.stdout.ref=Stdout
rootLogger.appenderRef.rolling.ref=InfoRollingFile
# console
# 指定输出源的类型与名称
appender.console.type=Console
appender.console.name=Stdout
appender.console.layout.type=PatternLayout
# 输出模板
appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
# rolling file
appender.rolling.type=RollingFile
appender.rolling.name=InfoRollingFile
appender.rolling.fileName=${filePath}
# 指定当发生Rolling时,文件的转移和重命名规则
appender.rolling.filePattern=${fileDir}/${fileName}_%d{yyyy-MM-dd}_%i.log
appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
# 指定记录文件的封存策略,该策略主要是完成周期性的日志文件封存工作
appender.rolling.policies.type=Policies
# 基于时间的触发策略
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
# 当前记录周期为每1h生成一个文件
appender.rolling.policies.time.interval=1
appender.rolling.policies.time.modulate=true
# 基于日志文件体积的触发策略
appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
# 当日志文件体积大于size指定的值时,触发Rolling
appender.rolling.policies.size.size=20M
# 文件封存的覆盖策略
appender.rolling.strategy.type=DefaultRolloverStrategy
# 生成分割(封存)文件的个数
appender.rolling.strategy.max=100
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
然后运行:
>java -cp ".;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j
2022-12-03 16:51:35,457 main ERROR Unable to locate appender "InfoRollingFile" for logger config "root"
2022-12-03 16:51:35.491 [ERROR] [main] [HelloLog4j.main(HelloLog4j.java:8)] - error
2022-12-03 16:51:35.494 [ WARN] [main] [HelloLog4j.main(HelloLog4j.java:9)] - warn
2022-12-03 16:51:35.494 [ INFO] [main] [HelloLog4j.main(HelloLog4j.java:10)] - Info
2022-12-03 16:51:35.494 [DEBUG] [main] [HelloLog4j.main(HelloLog4j.java:11)] - debug
2
3
4
5
6
可以看到有输出,并且有日志文件
# Appender
输出源,用于定义日志输出的地方。log4j2支持的输出源有很多,有
- 控制台ConsoleAppender、
- 文件FileAppender、AsyncAppender、RandomAccessFileAppender、RollingFileAppender、RollingRandomAccessFile 等。
ConsoleAppender
控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,以便调试。
name:指定Appender的名字。
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT。
PatternLayout:输出格式,不设置默认为:%m%n。
2
3
FileAppender
文件输出源,用于将日志写入到指定的文件,其底层是一个OutputStreamAppender,需要配置输入到哪个位置(例如:D:/logs/mylog.log)
name:指定Appender的名字。
fileName:指定输出日志的目的文件带全路径的文件名。
PatternLayout:输出格式,不设置默认为:%m%n。
2
3
RollingFileAppender
RollingFileAppender是一个OutputStreamAppender,它写入fileName参数中指定的File。因为它可以指定当日志文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则。避免日志文件过大,工作中常用
为什么叫rolling呢?因为日志是滚动的,不断新增的
# 参考
Log4j2基本使用入门 - 简书 (opens new window)
log4j2 入门教程_timchen525的博客-CSDN博客 (opens new window)
log4j2配置详细 - gsluofu - 博客园 (opens new window)
更多配置相关的说明,可以参考官网的文档:
Log4j – Configuring Log4j 2 (opens new window)
Log4j – Log4j 2 Appenders (opens new window)
Log4j – Frequently Asked Questions (opens new window)