Spring Boot 集成使用log4j2(異步)

log4j2異步的模式筑悴,采用的是disruptor高速并發(fā)框架肿男,所以速度很快纲堵,適合高并發(fā)的系統(tǒng)使用。

1棍辕、首先要去掉Spring Boot的默認(rèn)日志

主要是在spring-boot-starter增加例外暮现。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions><!-- 去掉依賴的默認(rèn)日志框架 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2、引入log4j2的相關(guān)依賴

這里有兩種方式:

1)第一種引入Spring Boot的默認(rèn)配置楚昭,Spring Boot來引入相關(guān)的日志包栖袋。

        <dependency> <!-- 引入log4j2依賴 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

2)第一種直接引入log4j2的相關(guān)配置。

這種方式需要引入兩個包抚太,一個是core核心實(shí)現(xiàn)塘幅,一個是API。

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.2</version>
        </dependency>

以上兩種尿贫,二選一电媳,別重復(fù)引入。

3庆亡、引入disruptor并發(fā)框架

        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.2</version>
        </dependency>

4匾乓、設(shè)置異步模式

1)完全異步模式

在開始程序里面設(shè)置參數(shù),對于參數(shù)變量又谋,許多朋友可能看到過“Log4jContextSelector”拼缝,也看到過“l(fā)og4j2.contextSelector”,這兩個變量效果是一樣的彰亥。

System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

或者啟動參數(shù)里設(shè)置

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

同樣是循環(huán)1W次咧七,輸出日志,最后的性能結(jié)果如下圖所示任斋。注意:因?yàn)槭钱惒降募套瑁钥刂婆_的日志就暫時不輸出了,否則控制臺看不到完成的時間。


Spring-boot-log4j2-完全異步.png

2)異步/同步混合模式

在配置文件中Logger使用<asyncRoot> 或 <asyncLogger>,而且<asyncRoot> 或 <asyncLogger>可以和<root> 或 <logger>混合使用瘟檩。
主要改動為loggers里面的這一段犬第,增加異步日志輸入。

        <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true">
            <appender-ref ref="RollingFileInfo" />
            <appender-ref ref="RollingFileWarn" />
            <appender-ref ref="RollingFileError" />
        </AsyncLogger>

完整的log4j2配置為如下所示芒帕。

<?xml version="1.0" encoding="UTF-8"?>
<!--設(shè)置log4j2的自身log級別為warn-->
<!--日志級別以及優(yōu)先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status歉嗓,這個用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置背蟆,
    當(dāng)設(shè)置成trace時鉴分,你會看到log4j2內(nèi)部各種詳細(xì)輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)-->
<configuration status="warn" monitorInterval="30">
    <!--先定義所有的appender-->
    <appenders>
        <!--這個輸出控制臺的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--輸出日志的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
        </console>
        <!-- 這個會打印出所有的info及以下級別的信息带膀,每次大小超過size志珍,
        則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔-->
        <RollingFile name="RollingFileInfo" fileName="logs/log4j2/info.log"
                     filePattern="logs/log4j2/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <!--控制臺只輸出level及以上級別的信息(onMatch)垛叨,其他的直接拒絕(onMismatch)-->
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="logs/log4j2/warn.log"
                     filePattern="logs/log4j2/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設(shè)置伦糯,則默認(rèn)為最多同一文件夾下7個文件,這里設(shè)置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="logs/log4j2/error.log"
                     filePattern="logs/log4j2/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>

    </appenders>
    <!--然后定義logger嗽元,只有定義了logger并引入的appender敛纲,appender才會生效-->
    <loggers>
        <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true">
            <appender-ref ref="RollingFileWarn" />
            <appender-ref ref="RollingFileError" />
        </AsyncLogger>
        <root level="all">
            <appender-ref ref="RollingFileInfo" />
        </root>
    </loggers>
</configuration>

這里需要注意的是,如果使用<asyncRoot> 或 <asyncLogger>剂癌,includeLocation="true"是必須要設(shè)置才會有類路徑等一些信息打印出來淤翔。最后的性能結(jié)果如下圖所示。


Spring-boot-log4j2-混合.png

5佩谷、性能比較

最后說明旁壮,通過學(xué)習(xí)前面的同步配置,我們可以看出性能梯度為:
全異步>混合模式>同步

其它注意

本文章樣例:
工程名:spring-boot-log4j2-async
GitHub:https://github.com/zzyjb/SpringBootLearning

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谐檀,一起剝皮案震驚了整個濱河市抡谐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桐猬,老刑警劉巖麦撵,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異课幕,居然都是意外死亡厦坛,警方通過查閱死者的電腦和手機(jī)五垮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門乍惊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人放仗,你說我怎么就攤上這事润绎。” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵莉撇,是天一觀的道長呢蛤。 經(jīng)常有香客問我,道長棍郎,這世上最難降的妖魔是什么其障? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮涂佃,結(jié)果婚禮上励翼,老公的妹妹穿的比我還像新娘。我一直安慰自己辜荠,他們只是感情好汽抚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伯病,像睡著了一般造烁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上午笛,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天惭蟋,我揣著相機(jī)與錄音,去河邊找鬼药磺。 笑死敞葛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的与涡。 我是一名探鬼主播惹谐,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驼卖!你這毒婦竟也來了氨肌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酌畜,失蹤者是張志新(化名)和其女友劉穎怎囚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桥胞,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恳守,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贩虾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片催烘。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缎罢,靈堂內(nèi)的尸體忽然破棺而出伊群,到底是詐尸還是另有隱情考杉,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布舰始,位于F島的核電站崇棠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丸卷。R本人自食惡果不足惜枕稀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谜嫉。 院中可真熱鬧抽莱,春花似錦、人聲如沸骄恶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僧鲁。三九已至虐呻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寞秃,已是汗流浹背斟叼。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留春寿,地道東北人朗涩。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像绑改,于是被迫代替她去往敵國和親谢床。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

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