• log4j2 配置详解


    【传送门】:log4j官网配置文件详解

    【参考文章】:Log4j2 类名与行名不显示问题

    【参考文章】:Log4j2中RollingFile的文件滚动更新机制

    【参考文章】:Log4j2源码解读——删除过期文件

    1. log4j2.xml配置详解

      官方文档讲的很清楚,有不清楚的地方可以去查阅官方文档

    <?xml version="1.0" encoding="UTF-8"?>
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!-- status log4j2 内部日志级别 -->
    <configuration status="INFO">
        
        <!-- 全局参数 -->
        <Properties>
            <Property name="pattern">[%p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %l : %m%n</Property>
            <Property name="logHome">logs</Property>
            <Property name="displayName">monitor-server</Property>
        </Properties>
    
        <Appenders>
            
            <Console name="console" target="SYSTEM_OUT" follow="true">
                <PatternLayout>
                    <pattern>${pattern}</pattern>
                </PatternLayout>
            </Console>
            
            <!-- 文件 每次运行程序会自动清空,由append属性决定 -->
            <File name="error" fileName="${loghome}/${displayName}_error.log" append="false">
                <!-- 指定error 级别的日志 -->
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout>
                    <pattern>${pattern}</pattern>
                </PatternLayout>
            </File>
            
            <!-- 滚动文件 -->
            <RollingFile name="rollingFile" fileName="${logHome}/${displayName}.log"
                         filePattern="${logHome}/${displayName}_%d{yyyy-MM-dd}.log">
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout>
                    <pattern>${pattern}</pattern>
                </PatternLayout>
                <!-- 按大小划分 -->
                <Policies>
                    <!-- 每隔1天生成一个日志,时间单位由 filePattern 的最小单位决定,最小粒度为天,则以天为单位,最小粒度为小时,则以小时为单位-->
                    <TimeBasedTriggeringPolicy interval="1"/>
                    <!-- 每隔10MB生成一个日志,单位可配置 KB,MB,GB-->
                    <SizeBasedTriggeringPolicy size="100 MB"/>
                </Policies>
            <!-- 指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除。-->
            <!--1.如果filePattern中仅含有date/time pattern,每次rollover时,将用当前的日期和时间替换文件中的日期格式对文件进行重命名。max参数将不起作用。-->
            <!-- 2.如果filePattern中仅含有整数计数器(即%i),每次rollover时,文件重命名时的计数器将每次加1(初始值为1),若达到max的值,将删除旧的文件。-->
            <!--此时就达到了限制压缩文件总个数的目的-->
            <!--3.如果filePattern中既含有date/time pattern,又含有%i,每次rollover时,计数器将每次加1,若达到max的值,将删除旧的文件,直到data/time pattern不再符合,被替换为当前的日期和时间,计数器再从1开始。-->
            <!---此时只能限制每个时间单位内的最大的压缩文件个数-->
                <DefaultRolloverStrategy max="20">
                    <!--默认情况下delete的删除条件为and的关系,即所有条件满足时才删除文件-->
                    <!--条件组合关系可以用 IfAll IfAny IfNot 进行动态组合-->
                    <Delete basePath="${logHome}" maxDepth="2">
                        <!--文件命名符合此格式-->
                        <IfFileName glob="app-*.log.gz" />
                        <!--文件时间大于60天-->
                        <IfLastModified age="60d" />
                        <!--文件总大小大于100GB-->
                        <IfAccumulatedFileSize exteeds="100 GB" />
                        <!--文件总个数大于100个-->
                        <IfAccumulatedFileCount  exceeds="100" />
                    </Delete>
                    
                    <!--示例:配置 or 的条件,条件满足任何一个就可以删除文件-->
                    <Delete basePath="${logHome}" maxDepth="2">
                        <!--文件命名符合此格式-->
                        <IfFileName glob="app-*.log.gz">
                            <IfAny>
                                <!--文件时间大于60天-->
                                <IfLastModified age="60d" />
                                <!--文件总大小大于100GB-->
                                <IfAccumulatedFileSize exteeds="100 GB" />
                                <!--文件总个数大于100个-->
                                <IfAccumulatedFileCount  exceeds="100" />
                            </IfAny>
                        </IfFileName>
                    </Delete>
            
            </RollingFile>
            
        </Appenders>
    
        <Loggers>
    
            <Logger name="org.springframework" level="WARN" additivity="false">
                <AppenderRef ref="console"/>
            </Logger>
    
            <Logger name="com.skd.server" level="info" additivity="false">
                <AppenderRef ref="console"></AppenderRef>
                <AppenderRef ref="error"></AppenderRef>
                <AppenderRef ref="rollingFile"></AppenderRef>
            </Logger>
    
            <!--日志信息输出的最低级别-->
            <Root level="debug">
            </Root>
    
        </Loggers>
    
    </configuration>

    2. 日志格式配置

    PatternLayout:

    • %m 输出代码中指定的消息;
    • %M 输出打印该条日志的方法名;
    • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;
    • %r 输出自应用启动到输出该log信息耗费的毫秒数;
    • %c 输出所属的类目,通常就是所在类的全名;
    • %t 输出产生该日志事件的线程名;
    • %n 输出一个回车换行符,Windows平台为"rn”,Unix平台为"n”;
    • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;
    • %l 输出日志事件的发生位置,及在代码中的行数;

    3. 原理解析

    3.1 删除策略

      删除策略逻辑处理的代码:有兴趣可以debug看下代码

    public class DeletingVisitor extends SimpleFileVisitor<Path> {
        private static final Logger LOGGER = StatusLogger.getLogger();
    
        private final Path basePath;
        private final boolean testMode;
        private final List<? extends PathCondition> pathConditions;
    
        /**
         * 删除策略逻辑处理的方法
         */
        @Override
        public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
            for (final PathCondition pathFilter : pathConditions) {
                final Path relative = basePath.relativize(file);
                if (!pathFilter.accept(basePath, relative, attrs)) {
                    LOGGER.trace("Not deleting base={}, relative={}", basePath, relative);
                    return FileVisitResult.CONTINUE;
                }
            }
            if (isTestMode()) {
                LOGGER.info("Deleting {} (TEST MODE: file not actually deleted)", file);
            } else {
                delete(file);
            }
            return FileVisitResult.CONTINUE;
        }
    }

      不同标签实现实现了accept()方法,根据自己的策略返回是否需要删除文件的结果 true或false

      

  • 相关阅读:
    laravel 安装完成后安装 vendor 目录
    requires php ~7.1 -> your PHP version (7.0.18) does not satisfy that requirement
    查看laravel版本
    git update-index --assume-unchanged
    Git 取消跟踪已版本控制的文件(亲测可行)
    git把某个文件去除版本控制
    git如何移除某文件夹的版本控制
    git如何移除某文件的版本控制
    git 教程
    Git branch && Git checkout常见用法
  • 原文地址:https://www.cnblogs.com/virgosnail/p/10155549.html
Copyright © 2020-2023  润新知