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

2024-04-07 12:18

本文主要是介绍Log4j1.x无缝升级Log4j2.x 异步滚动日志xml 配置大全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • Log4j1 切换升级Log4j2
      • 依赖管理(非Spring boot)
        • 删除log4j1.x相关的jar
        • 添加以下slf4j和log4j2的依赖.
        • web.xml中设置log4j2的监听器和过滤器(servlet3.0及以上版本不需要该步操作)
      • 依赖管理(Spring boot)
    • 全异步日志模式
      • Log4j2.xml同步滚动日志配置详解
    • 混合异步日志模式
      • Log4j2.x.xml 配置详细介绍
    • 官网异步和同步日志压测性能对比图
    • 高亮打印日志效果图 使用tail -f 指令查看

项目中代码优化的时候顺便研究了一把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><Delete basePath="${log.path}" maxDepth="3"><IfFileName glob="traceLog" /><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混合模式 AsyncLoggerLog4j-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.htmlevaluateOnStartup 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文件规则中日期格式最小单位来定) 默认值1modulate 是否调整时间按照标准的时间来点来判断策略触发 简单的说,如果你配置了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 默认值1max 默认值7compressionLevel 压缩水平,仅针对zip类型的历史文件时设置有效 level, 0-9, where 0 = none, 1 = best speed, through 9 = bestcompressiontempCompressedFilePattern 压缩文件时的临时文件名称--><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.htmlnestedConditions 列表--><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以上支持 (因为项目没有用,所以不做详细介绍)--><!-- 支持一次配置多条删除规则--><Delete basePath="${log.path}" maxDepth="3"><IfFileName glob="tracelog/**" /><IfLastModified age="${log.deleteAge}" /></Delete></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"/>

在这里插入图片描述

这篇关于Log4j1.x无缝升级Log4j2.x 异步滚动日志xml 配置大全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882579

相关文章

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总