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 · 訪問量 4978
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章