文章目錄
項目中代碼優化的時候順便研究了一把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"/>