log4j筆記:升級2.X版本的日志滾動問題


因為slf4j依賴的log4j在流量大的時候總遇到多線程引起的死鎖問題,升級到log4j2.x版本。原來的log4j.properties配置文件已經不被log4j2支持了,需要改寫為log4j2.xml。在升級的過程中,配置與原先相同,使用異步日志,按小時滾動,卻發現配置后日志輸出正常,但滾動的功能不正常,查出以下兩個問題。

 

1. 日志不按小時滾動

原來的配置如下:

 <RollingRandomAccessFile name="RollingFile" fileName="${backupFilePatch}${fileName}" filePattern="${backupFilePatch}${fileName}.%d{yyyy-MM-dd}.%i" immediateFlush="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %p %c{1}[%L]-%m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>            
            </Policies>
            <DefaultRolloverStrategy max="120"/>
 </RollingRandomAccessFile>

根據官網的介紹,我理解成了interval=1的時候固定按小時滾動,其實interval的單位是根據filePattern來的,即filePattern配置中的最小單位,所以在yyyy-MM-dd這樣的配置中,interval的單位是day,而%i則是interval的序號,日志是按天滾動的。所以將配置改為${backupFilePatch}${fileName}.%d{yyyy-MM-dd.HH}就能按小時滾動了。

 

2. 每小時滾動后,日志不寫入新文件,而是寫入舊的歸檔文件。

這個問題更詭異。tomcat啟動后,日志是寫入log文件的,但是整點日志滾動之后,log歸檔為log-日期,產生一個新的log文件,但日志還是打入了歸檔之后的文件log-日期。放置了一天之后,發現更詭異的事情,日志總是寫入上一個歸檔文件。例如,7點的時候,產生一個歸檔文件log-日期.6,7點到8點的日志都打入了文件6,log文件始終是空的,而8點之后,log歸檔為log-日期-7,之后的日志都打入文件7,新產生的log文件還是為空。

該問題遍尋不着解法。在某一次整點時,正好刷新了一下,發現log文件有新內容,再刷新又成為上面那種現象了。由此聯想到,有可能不只是log4j2在對這個文件進行操作。

 

排查發現,改寫log4j2.xml之后,原來的log4j.properties還留在項目里。由於maven層層疊疊的依賴,有幾個包引用的是log4j1.x版本,在運行的時候,始終有一個包用的是log4j1.x在打日志,因此加載的是log4j.properties的配置。log4j.properties和log4j2.xml的配置完全相同,寫入的也是同一個日志文件。整點的時候,這兩個類都對log文件進行歸檔操作,猜想是log4j2先執行歸檔,寫入新log文件,而這個文件又被log4j1歸檔,因此后面log4j2的日志都寫入了上一個歸檔文件。

 

將log4j.properties中的日志改為其他名稱,問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM