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" />
<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
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> <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"?> <configuration status="WARN" monitorInterval="30"> <appenders> <console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </console> <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 name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> <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 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> <loggers> <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>
|
配置占位符号
- %t 线程名
- %M 输出方法名
- %m 输出日志内容
- %p 优先级,即DEBUG、INFO等
- %r 输出自应用启动到输出该log信息耗费的毫秒数
- %c 输出所在类名称
- %n 回车换行
- %d 输出日志时间,可以指定格式,如%d{yyyy-MM-dd HH:mm:ss,SSS}
- %X 输出和当前线程关联的MDC,如%X{traceId}
- %F 输出日志产生时所在的文件名称
- %L 输出行号