0%

log4j2配置

log4j2配置

配置文件结构

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
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Appender>
<Filters>
<LevelRangeFilter minLevel="..." maxLevel="..." onMatch="..." onMismatch="..."/>
</Filters>
<PatternLayout pattern="..." charset="..."/>
<Policies>
<CronTriggeringPolicy schedule="..."/>
<SizeBasedTriggeringPolicy size="..."/>
<TimeBasedTriggeringPolicy />
</Policies>
</Appender>
</Appenders>
<Loggers>
<Logger>
<AppenderRef ref="...">
</Logger>
<Root>
<AppenderRef ref="...">
</Root>
</Loggers>

</Configuration>

先进行拆分一下,Configuration下分为两部分,Appenders和Loggers

Appenders详解

Appenders部分就是配置了一个Appender集合,Appender就是一个日志输出的管道,定义日志输出到的位置,而Appender在log4j2中有很多实现类,如ConsoleAppender(插件名称为Console)、FileAppender(插件名称为File)、RollingFileAppender(插件名称为RollingFile)等,在配置时使用插件名称即可

Appender

由于配置时使用插件名称即可,所以下述介绍时就直接使用插件名称了,比较简洁

Console

Console就是输出到控制台,有两种输出方式SYSTEM_OUT和SYSTEM_ERR,默认为SYSTEM_OUT

1
2
3
4
<Console name="stdout" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout charset="UTF-8" pattern="[%-5p %d{yyyy-MM-dd HH:mm:ss.SSS}] %l [%m]%n"/>
</Console>
File

File是指输出到文件,fileName指定日志文件位置,append表示是否追加,如果不追加,则使用的该日志文件原本内容就会清空,默认为true

1
2
3
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
RollingFile

File不可以进行日志滚动,实际项目中使用的并不多,而RollingFile是可以进行日志滚动的,在实际项目中使用较多。

日志滚动是指在达到一定条件时,日志文件进行分割

filePattern是指定日志文件命名格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<RollingFile name="file" fileName="${LOG_HOME}/test.log"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/test.log.%d{yyyyMMdd}.%i.bz2">
<PatternLayout charset="UTF-8" pattern="[%-5p %d{yyyy-MM-dd HH:mm:ss.SSS}] %l [%m]%n"/>
<!-- 配置日志何时滚动,分为时间和大小两类规则 -->
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="500MB"/>
</Policies>
<!-- 配置日志如何翻滚,指定了最大翻滚次数,超过之后按照规则删除 -->
<DefaultRolloverStrategy max="30">
<Delete basePath="${LOG_HOME}/%d{yyyyMMdd}/" maxDepth="2">
<IfFileName glob="*.log" />
<!--!Note: 这里的age必须和filePattern协调, 后者是精确到天,age的单位就是天
另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->
<!--7天-->
<IfLastModified age="7d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
Filter

Filter决定日志能否被输出,过滤条件有ACCEPT(接受),DENY(拒绝),NEUTRAL(中立),如果为ACCEPT或DENY,则后续Filter将不会执行,只有当是NEUTRAL是才会执行后续的Filter

常用的有TimeFilter、LevelRangeFilter、ThresholdFilter

1
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
Layout

控制日志的输出格式,基本上只使用PatternLayout这一种就够了

1
<PatternLayout  charset="UTF-8" pattern="[%-5p %d{yyyy-MM-dd HH:mm:ss.SSS}] %l [%m]%n"/>
Policy

控制日志何时滚动,常用的有TimeBasedTriggeringPolicy、SizeBasedTriggeringPolicy、CronTriggeringPolicy

  • TimeBasedTriggeringPolicy表示使用时间滚动策略,依赖于filePattern中配置的时间单位

    1
    2
    3
    4
    <!-- interval表示间隔,默认为1
    modulate true表示从启动时间开始算起,false表示从0开始算起,默认为false
    -->
    <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  • SizeBasedTriggeringPolicy根据日志文件大小进行滚动,单位为KB/MB/GB

    1
    <SizeBasedTriggeringPolicy size="100 MB"/>
  • CronTriggeringPolicy使用表达式来进行日志滚动

    1
    2
    <!-- 默认为"0 0 0 * * ?" 每天0点触发 -->
    <CronTriggeringPolicy schedule="0 0 0 * * ?" />
Strategy

控制日志如何滚动,使用DefaultRolloverStrategy即可

Loggers详解

Loggers中配置的是指定类或者指定包中的日志信息流向哪个Appender,以及输出的控制日志级别

对应的对象为LoggerConfig

1
2
private final ConcurrentMap<String, LoggerConfig> map;
private final LoggerConfig root;

分为root的和一般的logger

1
2
3
4
5
6
7
8
9
<loggers>
<!-- 如果不将additivity设为false,将会打印两遍日志,即logger打印一遍,root打印一遍 -->
<logger name="com.zhanghe.study.java8.Main" additivity="false">
<appender-ref ref="Console"/>
</logger>
<root level="info">
<appender-ref ref="Console"/>
</root>
</loggers>

记录一下

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
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/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>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>