Log4j2基本配置
日志级别
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。All:最低等级的,用于打开所有日志记录,OFF:最高等级的,用于关闭所有日志记录,其余可根据需要自己设置
代码调用
public class LogTest {
private static final Logger log = LogManager.getLogger(LogTest.class);
public static void main(String[] args) {
boolean flag = true;
int i=0;
while(i<10000){
ThreadContext.put("userId", String.valueOf(i));
log.error("日志输出 error:"+i++);
}
ThreadContext.clearAll();
}
}
基本配置说明(xml格式)
<?xml version="1.0" encoding="UTF-8"?>
<!--status为log4j2本身日志级别 monitorInterval为检查log4j2.xml更新配置文件时间(以秒为单位) -->
<Configuration status="error" monitorInterval="10">
<Appenders>
<!--控制台输出-->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[userId:%X{userId}]%-5p - %d{yyyy-MM-dd HH:mm:ss} %c [%t] %l -- %m%n"/>
</Console>
<!--文件输出 fileName为当前日志写入的文件,filePattern为归档日志生成的格式-->
<RollingRandomAccessFile name="RollingFile" fileName="E:\export\Logs\log-test\log-test.log"
filePattern="E:\export\Logs\log-test\log-test-%d{yyyy-MM-dd}-%i.log">
<!--level="error" :日志级别,onMatch="ACCEPT" :级别在info之上则接受,onMismatch="DENY" :级别在error之下则拒绝-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<!--PatternLayout为日志输出的格式-->
<PatternLayout charset="UTF-8"
pattern="[userId:%X{userId}] %-5p - %d{yyyy-MM-dd HH:mm:ss} [%t] %l -- %m%n"/>
<!--日志归档策略-->
<Policies>
<!--按照时间归档 modulate为是否调整格式使得生成下一个归档文件发生在间隔边界上 interval为生成归档文件间隔-->
<TimeBasedTriggeringPolicy modulate="false" interval="10"/>
<!--文件达到指定大小后文件发生归档-->
<SizeBasedTriggeringPolicy size="1024M"/>
</Policies>
<!--最多保留归档文件数 超出则之前的会被覆盖 -->
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
</Appenders>
<!--只有在Loggers并引入的appender,appender才会生效,相当于启动入口-->
<Loggers>
<!--org.mybatis包error级别才会输出-->
<logger name="org.mybatis" level="error" additivity="true"></logger>
<!--org.springframework包下日志只输出error才打印,不设置默认走Root中日志级别输出,additivity需不需要打印此logger继承的父logger-->
<logger name="org.springframework" level="error" additivity="false">
<!--当前logger的Appender-->
<AppenderRef ref="XXXAppender"/>
</logger>
<!--父级日志输出,没有指定则都是默认走这个日志级别输出-->
<Root level="debug" includeLocation="true">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="Mail"/>
</Root>
</Loggers>
</Configuration>
配置简单说明:
Configuration
status为log4j2本身日志级别,比如设置all启动时可以在控制台看到log4j2对应的加载日志,monitorInterval为检查log4j2.xml更新配置文件时间(以秒为单位),设置10则表示默认每10s重新加载配置文件
Appenders
Appenders里面定义了定义输出内容,输出格式,输出方式,日志保存策略等,上面展示了通常用的两种Console(控制台输出)和RollingRandomAccessFile(文件输出),主要以文件输出作为介绍:
- RollingRandomAccessFile:文件输出 fileName为当前日志写入的文件,filePattern为归档日志生成的格式
- ThresholdFilter:表示当前RollingFile下输出日志过滤,如设置为error时,即使logger里面设置为debug,但是只输出error级别的日志
- PatternLayout:日志输出的格式,参数具体可以网上查,这里面说下%X{userId},代码调用中ThreadContext.put(“userId”, String.valueOf(i)),ThreadContext设置了userId的值,在xml就可以获取到对应的值,ThreadContext类似于java中ThreadLocal,用它可以记录某个请求的特殊信息,比如用户登录信息,这样每个日志就可以清楚的记录对应每个人的操作记录。最后用ThreadContext.clearAll()来清除。
- Policies:日志归档策略;
- TimeBasedTriggeringPolicy:按照时间归档,interval为生成归档文件间隔,这里强调下interval的时间单位取决于filePattern中日志输出格式,例如:%d{yyyy-MM-dd-HH-mm}-%i.log则表示interval时间单位是按分钟,%d{yyyy-MM-dd}-%i.log则interval时间单位是按天归档,%i最好加上,不加可能出现同一日期维度超出文件大小归档时产生覆盖,加上归档时会输出xxx-1.log、xxx-2.log;modulate为是否调整格式使得生成下一个归档文件发生在间隔边界上,默认值为1,举个例子:例如filePattern是按照天归档(%d{yyyy-MM-dd}),interval值为8,当前时间为凌晨3:00启动程序日志开始生成,在不考虑文件大小情况下正常情况下第一个归档文件是在11点(3+8),而设置modulate=true时候则在8点就进行第一次归档,这样后面16个小时就能整好输出两次(16/8=2),说的有些啰嗦可以自己验证下。
- SizeBasedTriggeringPolicy:文件达到指定大小后文件发生归档,单位可以为KB,MB,GB,和上面时间配合使用时,比如上面设置每天归档,则同一时间维度下文件超出限制后就会按照2020-11-11-1.log、2020-11-11-2.log拆分文件。
- DefaultRolloverStrategy:最多保留归档文件数 超出则之前的会被覆盖.默认是7个文件
Loggers
Loggers是配置的入口,只有定义了logger并引入的appender,appender才会生效。
-
Root为默认的日志输出配置,没有经过logger配置的包都会走这个输出,例如配置中默认的日志输出级别都是debug。includeLocation配置为true后会打印出对应输出日志的代码行数。 2. logger:logger相当于自定义的日志,上面配置中org.mybatis包设置对应的日志输出级别为error,additivity="true"表示此error日志会在Root中输出;而org.springframework设置也为error,只不过设置了自己的XXXAppender,文件会输出到对应的日志上,additivity设置为false,如果设置为true,则会出现同样日志输出两份的现象,即自定义logger和Root中的Appender各自输出一份,所以自定子logger如果指定AppenderRef,最好设置additivity=“false”。
**如果上面描述有问题欢迎评论中批评指正,谢谢!!!**