SpringBoot之集成Logback日志(六)

一盲再、簡介

Java知名的日志有很多西设,比如:JUL、Log4j答朋、JCL贷揽、SLF4J、Logback梦碗、Log4j2,那么這些日志框架之間有著怎樣的關(guān)系?誕生的原因又是解決什么問題瑞躺?下面一起來看醇份。

1.1 JUL

Java有自己的日志框架JUL(Java Util Logging)在java.util.logging下,因?yàn)閷﹂_發(fā)者不友好斩例,使用成本太高和日志級別分類不清晰的問題雄人,所有很少有開發(fā)者用。

1.2 Log4j

因?yàn)镴UL的缺陷問題念赶,這就給了Log4j機(jī)會(huì)础钠,所有Log4j一經(jīng)推出就迅速風(fēng)靡全球。

1.3 JCL

JCL是Jakarta Commons-Logging的縮寫叉谜,Jakarta在這里指的是一個(gè)組織旗吁,而不是印度的首都雅加達(dá),Jakarta停局,一個(gè)早期的Apache開源項(xiàng)目阵漏,用于管理各個(gè)Java子項(xiàng)目,諸如Tomcat, Ant, Maven, Struts, JMeter, Velocity, JMeter, Commons等翻具。2011年12月履怯,在所有子項(xiàng)目都被遷移為獨(dú)立項(xiàng)目后,Jakarta名稱就不再使用了裆泳。

JCL誕生的初衷是因?yàn)镴ava自身的一些包用了JUL叹洲,而Log4j用戶使用的有很多,那么JCL就是提供一套API來實(shí)現(xiàn)不同Logger之間的切換工禾。

1.4 SLF4J

SLF4J(Simple Logging Facade For Java)簡單日志門面运提,和JCL功能類似蝗柔,但JCL有一個(gè)致命的缺點(diǎn)就是算法復(fù)雜,出現(xiàn)問題難以排除民泵,而SLF4J的誕生就是為了解決JCL的缺點(diǎn)癣丧。

值得一提的是SLF4J的作者就是Log4j的作者。

1.5 Logback

Logback是Log4j的作者的另一個(gè)開源日志組件栈妆,與Log4j相比胁编,Logback重新了內(nèi)核,使它的性能提升了很多鳞尔,大約是Log4j的10倍嬉橙,同時(shí)占用更小的內(nèi)存,并且完整的實(shí)現(xiàn)了SLF4J API是你可以很方便的切換日志框架寥假。

1.6 Log4j2

Log4j2有著和Logback相同的功能市框,但又有自己單用的功能,比如:插件式結(jié)構(gòu)糕韧、配置文件優(yōu)化枫振、異步日志等。

Log4j2是Log4j的升級萤彩,它比其前身Log4j 1.x提供了重大改進(jìn)蒋得,并提供了Logback中可用的許多改進(jìn),同時(shí)修復(fù)了Logback架構(gòu)中的一些固有問題乒疏。

從GitHub的更新日志來看额衙,Logback已經(jīng)有半年沒有更新了,而作為知名組織的Apache下的Log4j2的更新卻是非撑挛猓活躍的窍侧,Log4j 1.x 于2015年8月停止維護(hù)更新了。

GitHub地址

Logback:https://github.com/qos-ch/log...

log4j2:https://github.com/apache/log...

本文分別來看Logback和Log4j2在Spring Boot中的實(shí)現(xiàn)转绷。

二伟件、Logback使用

開發(fā)環(huán)境

  • JDK 8
  • Spring Boot 2.0.4 RELEASE
  • Maven
  • Windows 10
  • IDEA 2018.2

2.1 自定義日志配置

日志服務(wù)在ApplicationContext創(chuàng)建前就初始化了,所以通過設(shè)置屬性和傳統(tǒng)的配置XML文件议经,可以對日志進(jìn)行管理和控制斧账。

只需要在src/main/resources下,創(chuàng)建好約定名稱的XML文件煞肾,即可完成對日志系統(tǒng)的設(shè)置咧织,不同的日志系統(tǒng)有不同的約定名稱,如下列表:

日志 名稱
logback logback-spring.xml, logback-spring.groovy, logback.xml, 或者 logback.groovy
log4j2

log4j2-spring.xml 或者 log4j2.xml

|

Spring Boot官方建議使用“-spring”的命名規(guī)則籍救,進(jìn)行日志配置习绢,如:logback-spring.xml而不是logback.xml。

當(dāng)然你也可以自定義日志名稱,只需要在application.properties配置即可闪萄,代碼如下:

logging.config=classpath:logging-config.xml

來看一個(gè)logback-spring.xml示例文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 日志根目錄-->
    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/spring-boot-logback"/>

    <!-- 日志級別 -->
    <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/>

    <!--  標(biāo)識這個(gè)"STDOUT" 將會(huì)添加到這個(gè)logger -->
    <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>

    <!-- 日志文件名稱-->
    <property name="LOG_PREFIX" value="spring-boot-logback" />

    <!-- 日志文件編碼-->
    <property name="LOG_CHARSET" value="UTF-8" />

    <!-- 日志文件路徑+日期-->
    <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" />

    <!--對日志進(jìn)行格式化-->
    <property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/>

    <!--文件大小梧却,默認(rèn)10MB-->
    <property name="MAX_FILE_SIZE" value="50MB" />

    <!-- 配置日志的滾動(dòng)時(shí)間 ,表示只保留最近 10 天的日志-->
    <property name="MAX_HISTORY" value="10"/>

    <!--輸出到控制臺(tái)-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 輸出的日志內(nèi)容格式化-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_MSG}</pattern>
        </layout>
    </appender>

    <!--輸出到文件-->
    <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
    </appender>

    <!-- 定義 ALL 日志的輸出方式:-->
    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件路徑败去,日志文件名稱-->
        <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>

        <!-- 設(shè)置滾動(dòng)策略放航,當(dāng)天的日志大小超過 ${MAX_FILE_SIZE} 文件大小時(shí)候,新的內(nèi)容寫入新的文件圆裕, 默認(rèn)10MB -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <!--日志文件路徑广鳍,新的 ALL 日志文件名稱,“ i ” 是個(gè)變量 -->
            <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern>

            <!-- 配置日志的滾動(dòng)時(shí)間 葫辐,表示只保留最近 10 天的日志-->
            <MaxHistory>${MAX_HISTORY}</MaxHistory>

            <!--當(dāng)天的日志大小超過 ${MAX_FILE_SIZE} 文件大小時(shí)候,新的內(nèi)容寫入新的文件伴郁, 默認(rèn)10MB-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>

        </rollingPolicy>

        <!-- 輸出的日志內(nèi)容格式化-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_MSG}</pattern>
        </layout>
    </appender>

    <!-- 定義 ERROR 日志的輸出方式:-->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 下面為配置只輸出error級別的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <!--日志文件路徑耿战,日志文件名稱-->
        <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>

        <!-- 設(shè)置滾動(dòng)策略,當(dāng)天的日志大小超過 ${MAX_FILE_SIZE} 文件大小時(shí)候焊傅,新的內(nèi)容寫入新的文件剂陡, 默認(rèn)10MB -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <!--日志文件路徑,新的 ERR 日志文件名稱狐胎,“ i ” 是個(gè)變量 -->
            <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern>

            <!-- 配置日志的滾動(dòng)時(shí)間 鸭栖,表示只保留最近 10 天的日志-->
            <MaxHistory>${MAX_HISTORY}</MaxHistory>

            <!--當(dāng)天的日志大小超過 ${MAX_FILE_SIZE} 文件大小時(shí)候,新的內(nèi)容寫入新的文件握巢, 默認(rèn)10MB-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!-- 輸出的日志內(nèi)容格式化-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>${LOG_MSG}</Pattern>
        </layout>
    </appender>

    <!-- additivity 設(shè)為false,則logger內(nèi)容不附加至root 晕鹊,配置以配置包下的所有類的日志的打印,級別是 ERROR-->

    <logger name="org.springframework"     level="ERROR" />
    <logger name="org.apache.commons"      level="ERROR" />
    <logger name="org.apache.zookeeper"    level="ERROR"  />
    <logger name="com.alibaba.dubbo.monitor" level="ERROR"/>
    <logger name="com.alibaba.dubbo.remoting" level="ERROR" />

    <!-- ${LOG_ROOT_LEVEL} 日志級別 -->
    <root level="${LOG_ROOT_LEVEL}">

        <!-- 標(biāo)識這個(gè)"${STDOUT}"將會(huì)添加到這個(gè)logger -->
        <appender-ref ref="${STDOUT}"/>

        <!-- FILE_ALL 日志輸出添加到 logger -->
        <appender-ref ref="FILE_ALL"/>

        <!-- FILE_ERROR 日志輸出添加到 logger -->
        <appender-ref ref="FILE_ERROR"/>
    </root>

</configuration>

image.gif

2.4 代碼中使用日志

在代碼中使用日志暴浦,只需要使用如下代碼:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private Logger logger = LoggerFactory.getLogger(this.getClass());
//...
logger.debug("this is debug");
logger.info("this is info");
image.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溅话,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子歌焦,更是在濱河造成了極大的恐慌飞几,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件独撇,死亡現(xiàn)場離奇詭異屑墨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纷铣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門卵史,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搜立,你說我怎么就攤上這事程腹。” “怎么了儒拂?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵寸潦,是天一觀的道長色鸳。 經(jīng)常有香客問我,道長见转,這世上最難降的妖魔是什么命雀? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮斩箫,結(jié)果婚禮上吏砂,老公的妹妹穿的比我還像新娘。我一直安慰自己乘客,他們只是感情好狐血,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著易核,像睡著了一般匈织。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牡直,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天缀匕,我揣著相機(jī)與錄音,去河邊找鬼碰逸。 笑死乡小,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饵史。 我是一名探鬼主播满钟,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胳喷!你這毒婦竟也來了零远?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤厌蔽,失蹤者是張志新(化名)和其女友劉穎牵辣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奴饮,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纬向,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戴卜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逾条。...
    茶點(diǎn)故事閱讀 40,918評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖投剥,靈堂內(nèi)的尸體忽然破棺而出师脂,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布吃警,位于F島的核電站糕篇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酌心。R本人自食惡果不足惜拌消,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望安券。 院中可真熱鬧墩崩,春花似錦、人聲如沸侯勉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽址貌。三九已至铐拐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芳誓,已是汗流浹背余舶。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工啊鸭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锹淌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓赠制,卻偏偏與公主長得像赂摆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子钟些,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評論 2 361

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