1. 程式人生 > >程式碼方式配置Log4j並實現執行緒級日誌管理 第一部分

程式碼方式配置Log4j並實現執行緒級日誌管理 第一部分

文章目錄

一 為什麼寫略顯過時的東西

  講道理,現在還說Log4j有點過時了,因為自從Log4j2問世,全世界都在談Log4j2的配置,所以今天要說的核心並不在如何配置Log4j,不論是配置檔案方式,還是程式碼方式。

  我要說的重點,首先是通過以程式碼的方式來配置Log4j,為後面同樣以程式碼方式配置Log4j2進行配置做個鋪墊;二是想把自己是如何將需求轉為實現的過程做一個分享;三是想通過這兩篇博文的介紹來強調下,技能的提升光靠百度是不行的,一定是有真實的需求場景下,自己不僅要有文件閱讀能力,還要學會跟蹤原始碼,如此才能做到一法通萬法通。

二 需求

  1. 拋棄死板的配置檔案,靈活的通過程式碼方式對日誌元件進行配置;
  2. 實現執行緒級的日誌物件管理,可針對處理執行緒進行日誌級別等屬性控制;
  3. 實現日誌的非同步輸出機制,Log4j本身的非同步輸出效能提升並不明顯;
  4. 實現日誌同時按日誌檔案大小及日期變更進行備份,Log4j本身並不提供兩種方式同時生效的檔案配置。

三 程式設計能力如何提升

  寫到這兒我還是想再囉嗦兩句,其實當下IT行業水挺混的,魚龍混雜,有的人培訓個兩三個月就能出來拿個像樣的工資,有的人能力還不錯但是始終找不到中意的工作,不管什麼需求上來就百度,其實百度上的東西八九成都是特麼的抄來抄去的,死不要臉。

  既然現狀已經如此了,那怎麼提升自己,讓自己和別人有所區別自然就是我們最應該考慮的事情,別總想著跟別人學靠運氣找一家闊氣的公司,本事是自己的,飯碗可不是鐵打的。

  說到這裡,那麼對於已經入門的程式設計師,到底該怎麼提升?別人怎麼做的我不知道,我就說自己。對工作還是要認真的,哪怕輕鬆的任務,完成了請多思考下,程式碼結構,壓力效能,模式設計,是否可以再提升下?不怕複雜的需求,有了需求才好,沒做過的最好,做了就有了經驗;學會看文件,看不懂英文的就看翻譯的,看原始碼,看不懂就跟蹤除錯,跑兩邊比百度一下強很多,至少不會像網上有些人自己都沒除錯過就複製貼上別人的東西,瞎說八道的好;技能橫向擴充套件,多看書,知識體系健全之後你就不是你了。

四 我是如何分析Log4j的

  話歸主題,既然要拋棄配置檔案,那麼我們需要考慮一個事情:配置檔案的方式是怎麼實現的?

  別多想,我不是在問Log4j是怎麼讀取配置檔案,並作初始化的,這些破事兒網上大片大片的,說了有屌用。這裡就一個簡單的思路,Log4j是怎麼解析配置檔案的,我們的實現就應該是怎麼樣的。說的再直白些,配置檔案無非是為了Log4j的某些物件例項化提供了屬性設定,那麼我們只需要找出來那些物件型別和配置檔案的屬性對應即可。

  我找一個簡單的配置大夥先瞅瞅,如下:

log4j.rootLogger=DEBUG,console,dailyFile,im
log4j.additivity.org.apache=true
# 控制檯(console)
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 回滾檔案(rollingFile)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 定期回滾日誌檔案(dailyFile)
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

  複雜不?複雜個球,翻來覆去就那麼幾個節點而已:

  1. logger
  2. appender

  除此之外我沒看出來還有什麼更特殊的節點,再仔細看看心裡大概就有數了,appender有比較多的型別,如上我就看到了:

  1. ConsoleAppender
  2. RollingFileAppender
  3. DailyRollingFileAppender

  其他的不說了都一樣。既然有這些appender的型別,那麼Log4j必然有對應其實現的類,不信你自己翻翻原始碼:

Appender派生結構

  點到為止,已經明確了後續的編碼重點,就在Appender介面的實現上,我們需要做的就是如何通過程式碼的方式來例項化這些物件,拿RollingFileAppender來說,畢竟主要的需求還是將日誌輸出到檔案。

  檢視RollingFileAppender原始碼設計。先說一句,看原始碼先看類的結構,有哪些方法和成員是對外公開,這部分是我們重點關注的;又有哪些方法和成員是受保護的,這部分是我們覆蓋實現的重中之重;再看建構函式,有哪些能提供我們例項化物件的。基本上明確結構之後,再負載的設計也能下手了。類機構如下:

RollingFileAppender類結構

  RollingFileAppender派生自FileAppender,基本成員為最大檔案容、最大備份檔案數量等資訊,父類中仍有許多可用資訊,檢視方法相同不多贅述。Root類的結構檢視亦如此。

  這裡要說明的事情就一個,如何檢視原始碼,檢視類結構,並從類結構中獲取有用資訊,便於我們進行封裝、重寫。第二部分就開始講述我如何根據需求進行設計。