log4j2配置

本文深入解析Log4j2的配置,包括日志级别、输出格式、文件滚动策略、异步日志及性能优化。重点介绍了PatternLayout、ThresholdFilter、RollingRandomAccessFile等组件的使用,以及如何设置日志文件的滚动、清理策略,确保日志管理和性能的平衡。
摘要由CSDN通过智能技术生成
<?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>
       
       <!--
        &lt;!&ndash;includeLocation="false" 去除异步日志的行号信息,否则会影响效率,和同步都差不多了
        和appenders中的Async标签不同的是,本配置方法只影响logger,不影响appender&ndash;&gt;
        <AsyncLogger name="org.example.LogTest" level="info" additivity="false" includeLocation="false">
            <appender-ref ref="file"></appender-ref>
            <appender-ref ref="rraFile"></appender-ref>
        </AsyncLogger>

        &lt;!&ndash;以下通过引用appender中的Async的异步队列是不需要处理异步日志行号的,但是添加进异步队列的日志输出对象将被
        影响成为一个异步输出对象
        &ndash;&gt;
        <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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值