概述
文章目录
- 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
混合模式 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以上支持 (因为项目没有用,所以不做详细介绍)-->
<!-- 支持一次配置多条删除规则-->
<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 配置大全的全部内容,希望文章能够帮你解决Log4j1.x无缝升级Log4j2.x & 异步滚动日志xml 配置大全所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复