log4j2配置


log4j 2的配置(输出日志到WEB项目目录、不同级别日志保存不同文件、日志压缩等)

官方下载地址http://logging.apache.org/log4j/2.x/download.html
官方配置说明http://logging.apache.org/log4j/2.x/manual/configuration.html#SystemProperties

log4j 2版本已经不支持properties类型的配置文件了

Log4j 2.3是最后支持JAVA 6的版本,log4j组件2.4以后的版本已经能够支持.properties格式的配置文件(之前的2.x版均不支持.properties配置),默认配置文件名称及优先级如下(配置文件路径要放在classpath下):

优先级 文件类型 文件名
1 properties log4j2-test.properties
2 YAML log4j2-test.yaml log4j2-test.yml
3 JSON log4j2-test.json log4j2-test.jsn
4 XML log4j2-test.xml
5 properties log4j2.properties
6 YAML log4j2.yaml log4j2.yml
7 JSON log4j2.json log4j2.jsn
8 XML log4j2.xml

在没有任何配置的情况下,log4j2会使用默认配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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>

该配置只有一个Appender:Console,目标是SYSTEM_OUT,即日志内容,都会打印在控制台上。Root Logger的级别是error,即:所有error及以上级别的日志才会记录。
(注:日志级别顺序为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL ),所以最终只有2日志会输出(error,fatal)
配置第1行中的status=”WARN”,可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF,设置成“WARN”指:所有log4j2的event信息中,只有WARN及以上级别的信息才记录,大家可以把它改成TRACE试试(最低级别),看下输出内容有何变化。

再讲下如何把不同级别的日志,输出到不同的日志文件中以及文件大小限制及压缩。这个在网上,包括官网上,都没有一个是说清楚的。
比如,希望trace/debug级别的日志输出到debug.log,而info级别的日志输出到info.log,其他如warn/error/fatal级别的日志都输出到error.log,这样分开输出是有好处的。我们按照如下的log42j.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?xml version="1.0" encoding="UTF-8"?>
<!-- status="OFF",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF -->
<configuration status="OFF">
<!-- 定义下面的引用名 -->
<Properties>
<property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss z} %-5level %class{36}%L%M - %msg%xEx%n</property>
<property name="log-path">${web:rootDir}/logs</property><!-- ${web:rootDir}是项目根目录 -->
<property name="every_file_size">5M</property><!-- 日志切割的最小单位 -->
<property name="output_log_level">debug</property><!-- 日志输出级别 -->
</Properties>

<!--先定义所有的appender -->
<appenders>

<!--这个输出控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
<!--这个都知道是输出日志的格式 -->
<PatternLayout pattern="${log_pattern}" />
</Console>

<!-- debug级别日志文件 -->
<!--每次大小超过size,则这size大小的日志会自动进行压缩,作为存档 -->
<RollingFile name="app_debug" fileName="${log-path}/debug/debug.log" filePattern="${log-path}/debug/debug-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL" />
</Filters>
<PatternLayout pattern="${log_pattern}" />
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
</RollingFile>

<!-- info级别日志文件 -->
<RollingFile name="app_info" fileName="${log-path}/info/info.log" filePattern="${log-path}/info/info-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="${log_pattern}" />
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
</RollingFile>

<!-- error级别日志文件 -->
<RollingFile name="app_error" fileName="${log-path}/error/error.log" filePattern="${log-path}/error/error-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="${log_pattern}" />
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
</RollingFile>

</appenders>

<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!--建立一个默认的root的logger,需要在root的level中指定输出的级别, -->
<root level="${output_log_level}">
<appender-ref ref="Console" />
<appender-ref ref="app_debug"/>
<appender-ref ref="app_info"/>
<appender-ref ref="app_error"/>
</root>
</loggers>

</configuration>

主要是要理解ThresholdFilter的onMatch/onMismatch的三个选项值:ACCEPT/DENY/NEUTRAL,其实,根据字面意思,也很好理解。
重要的是,如果有多个ThresholdFilter,那么Filters是必须的,同时在Filters中,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,这个次序不能搞颠倒。

原文地址:http://hifor.net/posts/20150926-304680b6.html

0%