Log4j1.x无缝升级Log4j2.x & 异步滚动日志xml 配置大全

项目中代码优化的时候顺便研究了一把log4j2的相关内容。从log4j-1+版本升级到Log4j-2+版本。结合网上的升级相关资料和官网文档来编写这个文档。

Log4j1 切换升级Log4j2

依赖管理(非Spring boot)

删除log4j1.x相关的jar

删除项目中存在的Log4j1.x所必须的log4j和slf4j-log4j12等依赖.

  • 可以到项目的根目录,执行:mvn dependency:tree > tree.log
  • 之后使用 cat tree.log | grep log4j命令进行查找依赖了这两个jar的地方。
  • 剔除某个jar包依赖的子包
<exclusions>
	<exclusion>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
	</exclusion>
	<exclusion>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
	</exclusion>
	<!-- 这种方式表示全部依赖都剔除,只依赖裸的某个jar包 -->
	<exclusion>
		<groupId>*</groupId>
		<artifactId>*</artifactId>
	</exclusion>
</exclusions>	

添加以下slf4j和log4j2的依赖.

	<!-- slf4j核心包-->
	<dependency>        
		<groupId>org.slf4j</groupId>		
		<artifactId>slf4j-api</artifactId>		
		<version>1.7.13</version>		
	</dependency>		
	<dependency>		
		<groupId>org.slf4j</groupId>		
		<artifactId>jcl-over-slf4j</artifactId>		
		<version>1.7.13</version>		
		<scope>runtime</scope>		
	</dependency>		

	<!--核心log4j2jar包-->        
	<dependency>        
		<groupId>org.apache.logging.log4j</groupId>		
		<artifactId>log4j-api</artifactId>		
		<version>2.4.1</version>		
	</dependency>		
	<dependency>		
		<groupId>org.apache.logging.log4j</groupId>		
		<artifactId>log4j-core</artifactId>		
		<version>2.4.1</version>		
	</dependency>		
	<!--用于与slf4j保持桥接-->        
	<dependency>        
		<groupId>org.apache.logging.log4j</groupId>		
		<artifactId>log4j-slf4j-impl</artifactId>		
		<version>2.4.1</version>		
	</dependency>		
	<dependency>		
		<groupId>org.slf4j</groupId>		
		<artifactId>log4j-over-slf4j</artifactId>		
		<version>1.7.25</version>		
		<scope>test</scope>		
	</dependency>		
	<!--web工程需要包含log4j-web,非web工程不需要-->
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-web</artifactId>
		<version>2.4.1</version>
		<scope>runtime</scope>
	</dependency>
	<!--需要使用log4j2的AsyncLogger需要包含disruptor-->
	<dependency>
		<groupId>com.lmax</groupId>
		<artifactId>disruptor</artifactId>
		<version>3.2.0</version>
	</dependency> 	

web.xml中设置log4j2的监听器和过滤器(servlet3.0及以上版本不需要该步操作)

	<!--对于log4j2,Servlet2.5以前的版本需要-->  
	<listener>  
	   <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
	</listener>  
	<filter>  
	   <filter-name>log4jServletFilter</filter-name>  
	   <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>  
	</filter>  
	<filter-mapping>  
	   <filter-name>log4jServletFilter</filter-name>  
	   <url-pattern>/*</url-pattern>  
	   <dispatcher>REQUEST</dispatcher>  
	   <dispatcher>FORWARD</dispatcher>  
	   <dispatcher>INCLUDE</dispatcher>  
	   <dispatcher>ERROR</dispatcher>  
	</filter-mapping>  

注意:log4j2不再支持properties文件了,只支持xml,json或是yaml,不指定位置的情况下默认在src/main/resources下查找。

  • 如果需要自定义位置,需要在上面的web.xml中添加以下代码
<context-param>  
	<param-name>log4jConfiguration</param-name>  
	<param-value>/WEB-INF/classes/log4j2.xml</param-value>
</context-param> 

依赖管理(Spring boot)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

<!--
这个jar代表如下几个jar,其他的日志组件在引入相应的SpringBootStart引入的时候会自动引入
-->
<dependencies>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-slf4j-impl</artifactId>
		<version>2.12.1</version>
		<scope>compile</scope>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>2.12.1</version>
		<scope>compile</scope>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-jul</artifactId>
		<version>2.12.1</version>
		<scope>compile</scope>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>jul-to-slf4j</artifactId>
		<version>1.7.29</version>
		<scope>compile</scope>
	</dependency>
</dependencies>

全异步日志模式

官网介绍

日志xml部分按照正常非异步的日志形式配置,然后在JVM启动参数里增加参数

# 注意:在JVM启动参数中增加 
java -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -jar xxx.jar

注意事项:

  • 不要在全异步日志配置文件中使用AsyncAppender和AsyncLogger,这俩都是应用于混合型的日志记录模式中,这样的日志部分会产生两个线程来传递消息,造成不必要的性能消耗。

Log4j2.xml同步滚动日志配置详解

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE" monitorInterval="600">
    <Properties>
        <Property name="log.application.name">${sys:logging.application.name}</Property>
        <Property name="log.host">${sys:logging.host}</Property>
        <Property name="log.level.default">${sys:logging.default-level}</Property>
        <property name="log.level.console">${sys:logging.console-level}</property>
        <Property name="log.level.file">${sys:logging.file-level}</Property>
        <Property name="log.path">/home/logs/${log.application.name}</Property>
        <Property name="log.deleteAge">3d</Property>
        <Property name="log.pattern">[%-5level] | %d{yyyy-MM-dd HH:mm:ss.SSS} | ${log.host} | ${log.application.name} | %thread | %logger >%L | [ %X{SOFA-GroupName} , %X{SOFA-TraceId} , %X{SOFA-SpanId} ]| %msg%n%throwable</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <ThresholdFilter level="${log.level.console}" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log.pattern}"/>
        </Console>
    
        <RollingRandomAccessFile name="all-file" fileName="${log.path}/${log.application.name}-all.log"
                                         filePattern="${log.path}/bak/${log.application.name}-all-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="${log.level.file}" onMismatch="DENY" onMatch="ACCEPT"/>
            </Filters>
            <PatternLayout pattern="${log.pattern}"/>
                   
            <Policies>             
                <CronTriggeringPolicy schedule="0 0 14-6 ? * FRI-MON" />
				<OnStartupTriggeringPolicy minSize="1044480" />
				<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
				<SizeBasedTriggeringPolicy size="128 MB"/>
            </Policies>
			<DefaultRolloverStrategy>                               
                <Delete basePath="${log.path}" maxDepth="2">
                    <IfFileName glob="bak/${log.application.name}-all-*.log.gz" />
                    <IfLastModified age="${log.deleteAge}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
    
    </Appenders>

    <Loggers>
        <Logger name="org.apache.zookeeper" level="WARN"/>
		<Logger name="org.apache.curator" level="WARN"/>
        <Logger name="org.springframework" level="WARN"/>
        <Logger name="com.alibaba.dubbo" level="WARN"/>
        <Logger name="org.perf4j" level="WARN"/>
		<Logger name="org.jboss.logging" level="WARN"/>
		<Logger name="org.redisson" level="WARN"/>
		<Logger name="redis.clients.jedis" level="WARN"/>
        <Logger name="com.alipay.sofa" level="WARN"/>
        <Logger name="org.mybatis" level="WARN"/>
		<Logger name="org.apache.ibatis" level="WARN"/>
		<Logger name="com.baomidou.mybatisplus.core" level="WARN"/>
        <Logger name="org.hibernate.validator" level="WARN"/>
		<Logger name="druid.sql" level="WARN"/>
	  
        <Root level="${log.level.default}">
            <AppenderRef ref="Console" />
            <AppenderRef ref="all-file"/>
        </Root>
    </Loggers>
</Configuration>

混合异步日志模式

混合异步日志主要采用AsyncLogger和Async 来实现部分日志实现异步记录配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE" monitorInterval="600">
    <Properties>
        <Property name="log.application.name">${sys:logging.application.name}</Property>
        <Property name="log.host">${sys:logging.host}</Property>
        <Property name="log.level.default">${sys:logging.default-level}</Property>
        <property name="log.level.console">${sys:logging.console-level}</property>
        <Property name="log.level.file">${sys:logging.file-level}</Property>
        <Property name="log.path">/home/logs/${log.application.name}</Property>
        <Property name="log.deleteAge">3d</Property>
        <Property name="log.pattern">[%-5level] | %d{yyyy-MM-dd HH:mm:ss.SSS} | ${log.host} | ${log.application.name} | %thread | %logger >%L | [ %X{SOFA-GroupName} , %X{SOFA-TraceId} , %X{SOFA-SpanId} ]| %msg%n%throwable</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <ThresholdFilter level="${log.level.console}" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log.pattern}"/>
        </Console>
    
        <RollingRandomAccessFile name="all-file" fileName="${log.path}/${log.application.name}-all.log"
                                         filePattern="${log.path}/bak/${log.application.name}-all-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="${log.level.file}" onMismatch="DENY" onMatch="ACCEPT"/>
            </Filters>
            <PatternLayout pattern="${log.pattern}"/>
                   
            <Policies>             
                <CronTriggeringPolicy schedule="0 0 14-6 ? * FRI-MON" />
				<OnStartupTriggeringPolicy minSize="1044480" />
				<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
				<SizeBasedTriggeringPolicy size="128 MB"/>
            </Policies>
			<DefaultRolloverStrategy>                               
                <Delete basePath="${log.path}" maxDepth="2">
                    <IfFileName glob="bak/${log.application.name}-all-*.log.gz" />
                    <IfLastModified age="${log.deleteAge}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
		
		<!-- 通过Async 将某个Appender调整为异步日志 -->
        <Async name="async-request">
            <AppenderRef ref="all-file"/>
        </Async>
    
    </Appenders>

    <Loggers>
        <Logger name="org.apache.zookeeper" level="WARN"/>
		<Logger name="org.apache.curator" level="WARN"/>
        <Logger name="org.springframework" level="WARN"/>
        <Logger name="com.alibaba.dubbo" level="WARN"/>
        <Logger name="org.perf4j" level="WARN"/>
		<Logger name="org.jboss.logging" level="WARN"/>
		<Logger name="org.redisson" level="WARN"/>
		<Logger name="redis.clients.jedis" level="WARN"/>
        <Logger name="com.alipay.sofa" level="WARN"/>
        <Logger name="org.mybatis" level="WARN"/>
		<Logger name="org.apache.ibatis" level="WARN"/>
		<Logger name="com.baomidou.mybatisplus.core" level="WARN"/>
        <Logger name="org.hibernate.validator" level="WARN"/>
		<Logger name="druid.sql" level="WARN"/>
		
		
		<!-- 通过AsyncLogger 将某个Logger调整为异步日志 -->
		<AsyncLogger name="druid.sql.PreparedStatement" level="DEBUG" additivity="false">
            <AppenderRef ref="all-file"/>
        </AsyncLogger>
        <AsyncLogger name="druid.sql.ResultSet" level="DEBUG" additivity="false">
            <AppenderRef ref="all-file"/>
        </AsyncLogger>
        <AsyncLogger name="druid.sql.Statement" level="DEBUG" additivity="false">
            <AppenderRef ref="all-file"/>
        </AsyncLogger>
	  
        <Root level="${log.level.default}">
            <AppenderRef ref="Console" />
            <AppenderRef ref="all-file"/>
        </Root>
    </Loggers>
</Configuration>

Log4j2.x.xml 配置详细介绍


<?xml version="1.0" encoding="UTF-8"?>
<!--
    status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出,OFF 表示关闭打印
    monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。此处表示每隔600秒重读一次配置文件
    
    全异步模式 启动参数 java -Dog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    混合模式 AsyncLogger
    Log4j-2.9 and higher require disruptor-3.3.4.jar or higher on the classpath. Prior to Log4j-2.9, disruptor-3.0.0.jar or higher was required.
-->
<Configuration status="TRACE" monitorInterval="600">
    <!--日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL-->
    <!--如果设置为WARN,则低于WARN的信息都不会输出-->
    <Properties>
        <!-- 配置日志文件输出目录,此处为项目根目录下的logs文件夹 -->
		<!-- 这块参数的默认值以及其他的关联关系见EnvironmentCustomizer -->
        <Property name="log.application.name">${sys:logging.application.name}</Property>
        <Property name="log.host">${sys:logging.host}</Property>
        <Property name="log.level.default">${sys:logging.default-level}</Property>
        <property name="log.level.console">${sys:logging.console-level}</property>
        <Property name="log.level.file">${sys:logging.file-level}</Property>
        <Property name="log.path">/home/logs/${log.application.name}</Property>
		<!-- 测试环境和准生产环境目前几乎不排查历史的问题,无需保留太多日志,暂定保留3天 -->
        <!--
        <DefaultRolloverStrategy>
              <Delete basePath="${log.path}" maxDepth="2">
                  <IfLastModified age="${log.deleteAge}" />
              </Delete>
         </DefaultRolloverStrategy>
          age 必须填写,需要填写特殊的Duration.表达式,详情见http://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/rolling/action/Duration.html#parseCharSequence
      -->
        <Property name="log.deleteAge">3d</Property>
        <Property name="log.pattern">[%-5level] | %d{yyyy-MM-dd HH:mm:ss.SSS} | ${log.host} | ${log.application.name} | %thread | %logger >%L | [ %X{SOFA-GroupName} , %X{SOFA-TraceId} , %X{SOFA-SpanId} ]| %msg%n%throwable</Property>
		<!--
		     异步模式下,打印的信息如果带Location将会极大的消耗性能,比如HTML的location,或者pattern模式里的%C or $class, %F or %file, %l or %location, %L or %line, %M or %method, 等,因为Log4j需要在打印日志的时候做一次栈的快照才能获取这些信息,这对于性能来说是个极大的损耗
		     如果一定要打印位置,需要在相应的Logger节点配置和根Root节点设置"includeLocation=true"
		     官网关于location的说明 https://logging.apache.org/log4j/2.x/manual/async.html#Location
		-->
    </Properties>

    <Appenders>
        <!--这个输出控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="${log.level.console}" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log.pattern}"/>
        </Console>
    
        <!--
        RollingRandomAccessFile 使用介绍
        http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingRandomAccessFile
        -->
    
        <RollingRandomAccessFile name="all-file" fileName="${log.path}/${log.application.name}-all.log"
                                         filePattern="${log.path}/bak/${log.application.name}-all-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="${log.level.file}" onMismatch="DENY" onMatch="ACCEPT"/>
            </Filters>
            <PatternLayout pattern="${log.pattern}"/>
        
            <!-- 组合策略(任意满足一项TriggeringPolicy就会触发)-->
            <Policies>
                <!--
                根据自定义的cron表达式来自定义特殊的日志切割时间,可以应用于有固定的时间特性的情景,在高峰期到来之前做日起至切割,方便对这块部分采样数据做分析
                schedule 具体corn表达式,使用说明http://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/util/CronExpression.html
                evaluateOnStartup boolean 值,程序启动时做判断,如果日志文件最后修改时间和当前时间中间的时间匹配到corn的触发时间点,则会立马触发切割策略。
                   例如 设置没1小时触发一次,日志文件最后修改时间10:20 当前启动时间为 11:02 ,在这期间11 点本来会触发一次切割策略,因为中间服务关闭所以没有执行,
                   当evaluateOnStartup=true时,启动以后会立马补充执行一次切割策略
                -->
            
                <CronTriggeringPolicy schedule="0 0 14-6 ? * FRI-MON" />
    
                <!-- 通过比较两个条件来判断是否切割文件
                 1】日志更新时间和jvm的启动时间,简单的说就是重启的时候就满这个触发切割操作的条件
                 2】判断日志文件是否满足设置的文件切割大小(minSize int值),默认值1(单位byte),只要有任何内容写入就满足这个大小
                 1M=1024KB=1 044 480byte
                 当前的配置是需要日志文件满1M再做切分
                 -->
    
                <OnStartupTriggeringPolicy minSize="1044480" />
            
                <!-- 根据时间类做切割策略
               interval 切割策略边界(具体单位根据RollingXXXAppender中配置的filePattern文件规则中日期格式最小单位来定) 默认值1
               modulate 是否调整时间按照标准的时间来点来判断策略触发 简单的说,如果你配置了1天切割一次,modulate=true时这个1天开始的时间每天00:00:01 而不是程序启动时间,确保可以按照固定的规范来切割,否则会因为启动时间不一致造成切割时间随机变化
               maxRandomDelay 随机延迟时间,默认是为0表示时间到了以后立即执行触发切割
               -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            
                <!-- 根据文件大小,这个策略目前规则是最简单清晰的,根据文件的大小来判断切割。
                需要注意的是,这个规则下,RollingXXXAppender中配置的filePattern 格式必须包含%i 否则,当一天的文件超过切割限制多次时,文件会被覆盖,每个时间间隔只会保留一个文件,
               -->
                <SizeBasedTriggeringPolicy size="128 MB"/>
            </Policies>
        
        
            <!-- 决定日志文件删除的策略-->
        
            <!-- DefaultRolloverStrategy  这块一般都使用默认值,不做额外配置
            fileIndex	默认等于max, 当fileIndex=min 时,每次触发切割时将XX.log 文件命名为 XXX-i.log 不会去修改历史的文件名;当fileIndex=max 时,
            每次触发切割时会依次将当前日期单位下已经生成的XXX-i.log 文件重名(i+1),然后将XX.log 文件命名为 XXX-1.log;
            min 默认值1
            max 默认值7
            compressionLevel 压缩水平,仅针对zip类型的历史文件时设置有效 level, 0-9, where 0 = none, 1 = best speed, through 9 = best
            compression
            tempCompressedFilePattern 压缩文件时的临时文件名称
            -->
            <DefaultRolloverStrategy>
                
                <!-- 自动删除文件策略Log4j-2.5以上支持
                basePath 需要检索删除文件的目录
                maxDepth int 值,读取基层文件目录,默认=1,只读取当前目录下的文件
                testMode Boolean测试模式,默认关闭。当testMode=true 时可以不实际删除文件,但是会在StatusLogger 打印触发日志删除的相关日志,可以用于测试删除策略是否生效
                -->
                <Delete basePath="${log.path}" maxDepth="2">
                    <!-- 删除的时候需要同时满足所有配置的If部分规则
                    fFileName 根据文件名、文件路径
                    IfLastModified 根据最后修改文件的时间
                    IfAccumulatedFileCount  根据累计的文件数量
                    IfAccumulatedFileSize  根据累计的文件大小
                    ScriptCondition  根据脚本(贼强大,不过目前本人还未应用到)
                    -->
                    <!--
                    IfFileName  支持3种形式 glob和regex必须配置一种
                    glob 根据basePath 根据简单的语法规则去匹配的相对路径值,规则详情https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String)
                    regex 根据basePath 结合正则表达式规则去匹配的相对路径值,规则详情https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
                    nestedConditions 列表
                    -->
                    <IfFileName glob="bak/${log.application.name}-all-*.log.gz" />
                
                    <!--
                   IfLastModified  根据文件最后修改时间和当前时间的差值类判断比较的策略
                   age 必须填写,需要填写特殊的Duration.表达式,详情见http://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/rolling/action/Duration.html#parseCharSequence
                   这里age的时间单位必须和RollingXXXAppender中配置的filePattern 格式中时间最小单位一致,否则策略不生效
                   -->
                    <IfLastModified age="${log.deleteAge}" />
                </Delete>
                <!-- PosixViewAttribute 以文件操作属性、组权限,文件所有用户维度来控制的删除策略 Log4j-2.9以上支持 (因为项目没有用,所以不做详细介绍)-->
          
               
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
    

        <!-- 输出完整的sql,并且打印详细的返回信息,由于目前线上存在一些因为数据入库问题造成的bug,暂时开放这部分日志 -->
		<RollingRandomAccessFile name="full-sql-file" fileName="${log.path}/${log.application.name}-full-sql.log"
                     filePattern="${log.path}/bak/${log.application.name}-full-sql-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="DEBUG" onMismatch="DENY" onMatch="ACCEPT"/>
            </Filters>
            <PatternLayout pattern="${log.pattern}"/>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="128 MB"/>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${log.path}" maxDepth="2">
                    <IfFileName glob="bak/${log.application.name}-full-sql-*.log.gz" />
                    <IfLastModified age="${log.deleteAge}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
		
    
        <!-- 项目里出现异常的部分内容均输出于此,便于统计异常的数量,通过traceId信息将打印在其他文件日志部分内容串联起来查看 -->
        <RollingRandomAccessFile name="error-file" fileName="${log.path}/${log.application.name}-error.log"
                     filePattern="${log.path}/bak/${log.application.name}-error-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="WARN" onMismatch="DENY" onMatch="ACCEPT"/>
            </Filters>
            <PatternLayout pattern="${log.pattern}"/>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
				<SizeBasedTriggeringPolicy size="128 MB"/>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${log.path}" maxDepth="2">
                    <IfFileName glob="bak/${log.application.name}-error-*.log.gz" />
                    <IfLastModified age="${log.deleteAge}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
    
        <!-- log4j2异步日志记录功能,减少因为日志记录io消耗对系统的影响,提高系统性能(目前这种做法是异步和同步组合使用版本)
       官网介绍 https://logging.apache.org/log4j/2.x/manual/async.html
        -->
    </Appenders>

    <Loggers>
        <!-- zk客户端相关日志 -->
        <Logger name="org.apache.zookeeper" level="WARN"/>
		<Logger name="org.apache.curator" level="WARN"/>
		
		<!-- spring 框架日志 -->
        <Logger name="org.springframework" level="WARN"/>
		
		<!-- dubbo框架 -->
        <Logger name="com.alibaba.dubbo" level="WARN"/>
		
		<!-- 其他模块日志 -->
        <Logger name="org.perf4j" level="WARN"/>
		<Logger name="org.jboss.logging" level="WARN"/>
  
		<!-- redis redisson、jedis相关信息-->
		<Logger name="org.redisson" level="WARN"/>
		<Logger name="redis.clients.jedis" level="WARN"/>
     
	    <!-- alipay sofa框架日志-->
        <Logger name="com.alipay.sofa" level="WARN"/>
        
		<!-- 数据库相关的,mybatis、mybatis-plus、hibernate、-->
        <Logger name="org.mybatis" level="WARN"/>
		<Logger name="org.apache.ibatis" level="WARN"/>
		<Logger name="com.baomidou.mybatisplus.core" level="WARN"/>
        <Logger name="org.hibernate.validator" level="WARN"/>
		<Logger name="druid.sql" level="WARN"/>
  
		<Logger name="com.hip" level="${log.level.default}"/>
		<Logger name="com.yuntai" level="${log.level.default}"/>
        <Logger name="com.dap" level="${log.level.default}"/>


        <!-- 有针对性的单独拉一部分文件到单独的文件,便于日志分析additivity="false" 的情况下,只会在配置的appender里记录日志,默认additivity="true" -->
		

	    <!-- 打印sql日志(目前生产环境会出现因为mycat数据库问题造成插入的数据id和实际不一致的情况,暂时保留这块日志方便排查,稳定以后可以控制不打印) -->
        <Logger name="druid.sql.PreparedStatement" level="DEBUG" additivity="false">
            <AppenderRef ref="full-sql-file"/>
        </Logger>
        <Logger name="druid.sql.ResultSet" level="DEBUG" additivity="false">
            <AppenderRef ref="full-sql-file"/>
        </Logger>
        <Logger name="druid.sql.Statement" level="DEBUG" additivity="false">
            <AppenderRef ref="full-sql-file"/>
        </Logger>
	  
        <Root level="${log.level.default}">
            <AppenderRef ref="Console" />
            <AppenderRef ref="all-file"/>
            <AppenderRef ref="error-file"/>
        </Root>
    </Loggers>
</Configuration>

官网异步和同步日志压测性能对比图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

高亮打印日志效果图 使用tail -f 指令查看

<PatternLayout pattern="[%-5p][%d{yyyy/MM/dd HH:mm:ss}_%r][%t][%l]%highlight{%m}{FATAL=Bright Red, ERROR=Bright Magenta, WARN=Bright Yellow, INFO=Bright Cyan, DEBUG=Bright Green, TRACE=Bright White}%n"/>

在这里插入图片描述

发布了22 篇原创文章 · 获赞 1 · 访问量 3235

猜你喜欢

转载自blog.csdn.net/tian_111222333/article/details/103938078