log4j2 配置簡要分析

從一個log4j2的xml配置說起


對于做后端的同學(xué)來說陨倡,log是分析bug瞎嬉、查找問題不可或缺的工具敦姻,好的日志配置將使我們的開發(fā)工作如虎添翼社搅。 把視線聚焦到j(luò)ava蝇狼,常用的日志工具有l(wèi)og4j谅猾,log4j2以及l(fā)ogback等领斥,其中l(wèi)og4j2功能較為強(qiáng)大映九,運行效率也較高梦湘,我們就來用一個例子看一看log4j2的配置思路,下面就是這個配置文件:

<Configuration status="WARN" monitorInterval="30">
  <Properties>
    <Property name="instance">$${sys:instance}</Property>
    <Property name="log.dir">$${sys:logdir}</Property>
  </Properties>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout
          pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
    </Console>

    <RollingRandomAccessFile name="infoLog" fileName="${log.dir}/${instance}-info.log"
        filePattern="${log.dir}/%d{yyyy-MM}/${instance}-info-%d{yyyy-MM-dd}-%i.log.gz"
        append="true">
      <PatternLayout
          pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
      <Filters>
        <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
      </Filters>
      <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="20 MB"/>
      </Policies>
    </RollingRandomAccessFile>

    <RollingRandomAccessFile name="warnLog" fileName="${log.dir}/${instance}-warn.log"
        filePattern="${log.dir}/%d{yyyy-MM}/${instance}-warn-%d{yyyy-MM-dd}-%i.log.gz"
        append="true">
      <Filters>
        <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <PatternLayout
          pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
      <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="20 MB"/>
      </Policies>
    </RollingRandomAccessFile>

    <RollingRandomAccessFile name="errorLog" fileName="${log.dir}/${instance}-error.log"
        filePattern="${log.dir}/%d{yyyy-MM}/${instance}-error-%d{yyyy-MM-dd}-%i.log.gz"
        append="true">
      <Filters>
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <PatternLayout
          pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
      <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="20 MB"/>
      </Policies>
    </RollingRandomAccessFile>
  </Appenders>

  <Loggers>
    <!-- 第三方的軟件日志級別 -->
    <logger name="org.springframework" level="info" additivity="true">
      <AppenderRef ref="warnLog"/>
      <AppenderRef ref="errorLog"/>
    </logger>

    <logger name="java.sql.PreparedStatement" level="debug" additivity="true">
      <AppenderRef ref="Console"/>
    </logger>

    <!-- root logger 配置 -->
    <Root level="info" includeLocation="true">
      <AppenderRef ref="infoLog"/>
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

什么是status和monitorInterval


我們看到,Configuration有2個屬性status和monitorInterval捌议,它們分別是log4j2自身組件的日志級別以及重新刷新配置文件的時間哼拔,通過配置status可以看到log4j2相關(guān)的日志,配置monitorInterval可以通過修改配置文件來改變?nèi)罩九渲谩?/p>

log4j2的層次結(jié)構(gòu)


從上面的log4j2.xml配置文件中瓣颅,我們可以看到log4j2的配置文件中主要分為2塊倦逐,一塊為appender,描述了如何記錄日志宫补,另外一部分是log config檬姥,記錄了哪種日志對應(yīng)哪種級別。 而不同的LogConfig之間其實是有繼承關(guān)系的粉怕,子LogConfig會繼承parent的屬性健民,而所有LogConfig都繼承自Root LogConfig。所以即使只配置了root logger贫贝,你一樣可以在任何地方通過LoggerFactory.getLogger獲取一個logger對象荞雏,記錄日志。

那么日志之間的繼承關(guān)系是由什么決定的呢平酿?看看上面的配置文件中root以外的2個logConfig,只有3個配置:日志級別悦陋,name以及appender蜈彼,從直覺上看應(yīng)當(dāng)是name最可能決定了LogConfig的繼承關(guān)系,其實也正是如此:com.foo是com.foo.Bar的父級俺驶;java是java.util的父級幸逆,是java.util.vector的祖先(注意name區(qū)分大小寫)。

理解了這一點暮现,我們就能理清log4j2配置的思路:先配置一個root还绘,讓所有需要使用日志的logger繼承,然后對有特別需要的logger進(jìn)行特殊的配置栖袋,比如我們希望org.springframework包只記錄error以及warn級別的log拍顷,再比如,我們希望能顯示mybatis執(zhí)行的sql的日志塘幅,都可以進(jìn)行個性化的配置昔案。

appender的配置


appender是LogConfig的重要組成部分,一個LogConfig可以使用多個appender电媳,一個appender也可以被多個LogConfig使用踏揣,appender多種多樣,不同的appender也有不同的屬性和配置匾乓,難以一一闡述捞稿,需要使用時可以直接查看文檔來進(jìn)行個性化配置。不過就filters可以單獨拿出來討論一下。filter有兩個重要屬性onMatchonMismatch娱局≌煤ィ可以有DENY、ACCEPT或NEUTRAL配置,DENY說明不由當(dāng)前appender處理铃辖,ACCEPT說明由當(dāng)前filter處理剩愧,而NEUTRAL說明如果按順序還有其他filter則由其他filter處理,如果當(dāng)前filter已經(jīng)是最后一個filter娇斩,則由當(dāng)前appender處理仁卷。

異步日志


log4j2的官方文檔建議記錄程序行為日志異步日志,效率更高犬第。因為異步日志使用的是無鎖技術(shù)锦积,所以需要引入Disruptor。然后可以通過配置異步的appender或Logger來實現(xiàn)異步日志:

<asyncRoot level="DEBUG">
    <appender-ref ref="infoLog" />
    <appender-ref ref="Console" />
</asyncRoot>

 <Async name="Async">
      <AppenderRef ref="infoLog"/>
</Async>

動態(tài)修改日志級別

動態(tài)修改日志級別是一個很實用的功能歉嗓,關(guān)于如果動態(tài)修改日志級別丰介,請參考美團(tuán)的一篇文章:日志級別動態(tài)調(diào)整——小工具解決大問題

總結(jié)


以上就是對log4j2的配置的一些總結(jié),更多信息請關(guān)注官方文檔鉴分。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哮幢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子志珍,更是在濱河造成了極大的恐慌橙垢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伦糯,死亡現(xiàn)場離奇詭異柜某,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敛纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門喂击,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淤翔,你說我怎么就攤上這事翰绊。” “怎么了旁壮?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵辞做,是天一觀的道長。 經(jīng)常有香客問我寡具,道長秤茅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任童叠,我火速辦了婚禮框喳,結(jié)果婚禮上课幕,老公的妹妹穿的比我還像新娘。我一直安慰自己五垮,他們只是感情好乍惊,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著放仗,像睡著了一般润绎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诞挨,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天莉撇,我揣著相機(jī)與錄音,去河邊找鬼惶傻。 笑死棍郎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的银室。 我是一名探鬼主播涂佃,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜈敢!你這毒婦竟也來了辜荠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤抓狭,失蹤者是張志新(化名)和其女友劉穎伯病,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辐宾,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年膨蛮,在試婚紗的時候發(fā)現(xiàn)自己被綠了叠纹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡敞葛,死狀恐怖誉察,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惹谐,我是刑警寧澤持偏,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站氨肌,受9級特大地震影響鸿秆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怎囚,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一卿叽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦考婴、人聲如沸贩虾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缎罢。三九已至,卻和暖如春考杉,著一層夾襖步出監(jiān)牢的瞬間策精,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工奔则, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蛮寂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓易茬,卻偏偏與公主長得像酬蹋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抽莱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在應(yīng)用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況范抓,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計分析...
    時待吾閱讀 4,953評論 1 13
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計分析...
    時待吾閱讀 4,966評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理食铐,服務(wù)發(fā)現(xiàn)匕垫,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • Spring Boot-日志配置(超詳細(xì)) 更新日志:20170810 更新通過 application.yml傳...
    inke閱讀 67,210評論 9 122
  • log4j是一個被廣泛使用的Java日志記錄框架虐呻,通過使用該框架象泵,我們可以在自己的項目中根據(jù)自身需求靈活配置日志輸...
    LilacZiyun閱讀 5,915評論 0 7