<?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">
<!--
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间
%p : 日志输出格式
%c : logger的名称
%m : 日志内容,即 logger.info("message")
%n : 换行符
%C : Java类名
%L : 日志输出所在行数
%M : 日志输出所在方法名
hostName : 本地机器名
hostAddress : 本地ip地址
-->
<!--先定义所有的appender-->
<properties >
<property name="LOG_HOME">./logs</property>
</properties>
<appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<File name="file" fileName="file.log">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<!--<RollingFile>
</RollingFile>-->
<!--使用随机io流,效率更高-->
<RollingRandomAccessFile name="rraFile"
fileName="${LOG_HOME}/service.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/%d{yyyy-MM-dd-HH-mm--ss}.log">
<!--immediateFlush="false" 是RollingRandomAccessFile的一个属性,
设置为false可以提示5倍的吞吐量但是可能导致部分日志丢失
filePattern是相当于新建文件到指定目录,遇到同名的直接覆盖的命名规则
而正常日志输出到文件是可以直接在过去日志文件后方添加的
-->
<PatternLayout>
<!--pattern也可以采取这种方式-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>
</PatternLayout>
<Policies>
<!--设置系统启动时触发拆分规则,生成一个新的日志文件-->
<OnStartupTriggeringPolicy/>
<!--interval设置文件分裂的时间间隔,默认值1,单位为filePattern最小时间
modulate="true"可以使得准点拆分比如是3点10分26s339ms,
那么就会等到3点10分27s整发送第一次分割,生成2022-01-26-03-10-26文件
下一次就是3点10分28s整
-->
<TimeBasedTriggeringPolicy interval="1" />
<!-- 设置size的时候大小必须大于filePattern所划分的按时间设置的文件名的单位时间内所能添加最多日志的
大小,如d{yyyy-MM-dd-HH-mm-ss}是以秒为时间节点,如果size设置为100 KB,在1s内输出的日志使得文件
大小大于100KB那么会覆盖当前文件,-->
<SizeBasedTriggeringPolicy size="5 MB"/>
<!--
当TimeBasedTriggeringPolicy,SizeBasedTriggeringPolicy
都进行设置时,那么按时间间隔会分裂文件,超过大小也会分裂文件,但是size设置过小的话
可能还没进行时间间隔分裂就触发了超过size分裂,那么就可能发生日志覆盖,因为新增文件名可能和
上一个文件同名,因为时间是在同一s(当前filePattern为s)
-->
<!--
配置说明:max限制文件个数
basePath只删除该目录下的
maxDepth删除的层级,1就是只删除logs该目录下的,为2就是在logs目录中的子目录中找到符合要求的并删除
glob删除文件必须是该后缀
age超过4d未进行更改的删除
-->
<DefaultRolloverStrategy max="10">
<Delete basePath="${LOG_HOME}/" maxDepth="1">
<!--<IfFileName glob="*.log.zip" />-->
<IfFileName glob="*.log" />
<IfLastModified age="4s" />
</Delete>
</DefaultRolloverStrategy>
</Policies>
</RollingRandomAccessFile>
<!--设置异步日志可以最好使用混合异步日志而不是全局,有时候日志是需要在业务逻辑下输出的
-->
<Async name="myAsync">
<AppenderRef ref="console"/>
</Async>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<root level="debug">
<appender-ref ref="file"></appender-ref>
<appender-ref ref="rraFile"></appender-ref>
</root>
<!--
<!–includeLocation="false" 去除异步日志的行号信息,否则会影响效率,和同步都差不多了
和appenders中的Async标签不同的是,本配置方法只影响logger,不影响appender–>
<AsyncLogger name="org.example.LogTest" level="info" additivity="false" includeLocation="false">
<appender-ref ref="file"></appender-ref>
<appender-ref ref="rraFile"></appender-ref>
</AsyncLogger>
<!–以下通过引用appender中的Async的异步队列是不需要处理异步日志行号的,但是添加进异步队列的日志输出对象将被
影响成为一个异步输出对象
–>
<Logger name="org.example.LogTest" level="info" additivity="false">
<appender-ref ref="file"></appender-ref>
<appender-ref ref="rraFile"></appender-ref>
<appender-ref ref="myAsync"></appender-ref>
</Logger>-->
</loggers>
</configuration>
log4j2配置
最新推荐文章于 2024-03-11 16:33:39 发布
本文深入解析Log4j2的配置,包括日志级别、输出格式、文件滚动策略、异步日志及性能优化。重点介绍了PatternLayout、ThresholdFilter、RollingRandomAccessFile等组件的使用,以及如何设置日志文件的滚动、清理策略,确保日志管理和性能的平衡。
摘要由CSDN通过智能技术生成