SpringBoot整合Logback日志框架配置全解析

SpringBoot中Logback日志配置解析本篇要點一担猛、Logback日志框架介紹二松蒜、SpringBoot與Logback1、默認日志格式2读串、控制臺輸出3聊记、文件輸出4、日志級別5恢暖、日志組6排监、自定義log配置三、logback-spring.xml自定義注意事項配置文件下載參考閱讀

SpringBoot中Logback日志配置解析

本篇要點

  • 介紹什么是Logback

  • 介紹SpringBoot中對logging默認的配置

  • 介紹自定義logback-spring.xml的注意點

一杰捂、Logback日志框架介紹

SpringBoot使用 Commons Logging 進行所有內部日志的記錄舆床,但默認配置也提供了對常用日志的支持,如 Java Util Logging嫁佳,Log4J2挨队,和Logback. 每種logger都可以通過配置使用控制臺或文件輸出日志內容。

Logback是log4j框架的作者開發(fā)的新一代日志框架蒿往,它效率更高盛垦、能夠適應諸多的運行環(huán)境,同時天然支持SLF4J瓤漏。

二腾夯、SpringBoot與Logback

假設你使用starter啟動創(chuàng)建SpringBoot應用,則默認已經導入了spring-boot-starter-logging的依賴蔬充,相繼也就導入了logback所需要的依賴俯在。

log1.png

1、默認日志格式

于是娃惯,當我們啟動SpringBoot應用時跷乐,控制臺將會顯示INFO級別的日志輸出。

log2.png

可以看到趾浅,輸出內容如下:

  • 日期和時間愕提,精確到毫秒級別。

  • 日志級別:INFO皿哨,【日志級別默認從高到低:ERROR浅侨,WARN,INFO证膨,DEBUG如输,TRACE】。

  • 進程ID

  • 分隔符:來標識實際日志消息的開始。

  • 線程名:用方括號括起來(在控制臺輸出時可能被截斷)不见。

  • 日志記錄器名稱:這通常是源類名稱(通嘲幕縮寫)。

  • 日志信息

logback是沒有FATAL級別的稳吮,它對應的就是ERROR缎谷。

2、控制臺輸出

默認的日志配置就是將日志信息顯示到控制臺灶似,默認情況下列林,將會顯示INFO級別以上的日志信息。你還可以通過使用--debug標志啟動debug模式酪惭。

$ java -jar myapp.jar --debug

使用IDEA操作可以編輯Program arguments:--debug希痴。

在application.properties中配置debug=true同樣也可以將日志級別調整到DEBUG。

3春感、文件輸出

默認情況下润梯,SpringBoot的日志只會輸出到控制臺,如果你還想輸出到文件中甥厦,你需要配置logging.file.namelogging.file.path兩個屬性纺铭。

下面這個表格展示如何組合使用logging.*來達到理想的效果:

logging.file.name logging.file.path Example Description
(none) (none) 只會輸出到控制臺
指定文件 (none) my.log 寫入指定的日志文件在當前項目目錄下
(none) 指定目錄 log 在當前項目下的log目錄,寫入spring.log文件

日志文件達到10 MB時會觸發(fā)滾動策略【切分】刀疙,默認情況下會記錄INFO以上級別的信息舶赔。 可以使用logging.file.max-size屬性更改大小限制。 除非已設置logging.file.max-history屬性谦秧,否則默認情況下將保留最近7天的輪轉日志文件竟纳。 可以使用logging.file.total-size-cap限制日志歸檔文件的總大小。 當日志歸檔的總大小超過該閾值時疚鲤,將刪除備份锥累。 要在應用程序啟動時強制清除日志存檔,請使用logging.file.clean-history-on-start屬性集歇。

4桶略、日志級別

可以使用logging.level設置所有受支持的日志記錄器的級別。

logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error

5诲宇、日志組

使用logging.group能夠將相關的logger組合在一起統(tǒng)一管理日志級別等配置际歼。使用方法如下:

假設定義了group為tomcat:

logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat

一旦這樣定義之后,就可以僅僅通過一行配置姑蓝,完成相關三個logger的級別配置:

logging.level.tomcat=TRACE

SpringBoot預定義了兩個開箱即用的日志組:

Name Loggers
web org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
sql org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener
# pre-defined
logging.level.web=debug
logging.level.sql=debug

6鹅心、自定義log配置

由于日志服務一般都在ApplicationContext創(chuàng)建前就初始化了,它并不是必須通過Spring的配置文件控制纺荧。因此通過系統(tǒng)屬性和傳統(tǒng)的Spring Boot外部配置文件依然可以很好的支持日志控制和管理旭愧。

你可以根據你的日志系統(tǒng)颅筋,按照下面表格的定義規(guī)則,選擇定義對應的日志配置:

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

SpringBoot官方推薦使用帶有-spring的文件名作為配置输枯,如logback-spring.xml而不是logback.xml议泵。

這樣命名的好處在于:因為標準的logback.xml配置文件加載得太早,所以不能在其中使用擴展用押,需要使用logback-spring.xml肢簿。

當然上面是默認的命名規(guī)則靶剑,如果你想自定義xml的名稱蜻拨,自定義路徑,可以通過logging.config屬性配置:logging.config=classpath:logging-config.xml

三桩引、logback-spring.xml自定義注意事項

接下來分享一份配置十分詳細的logback.xml配置缎讼,參照注釋,應該就能夠掌握xml的定義坑匠。

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds" debug="false">
    <!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL血崭,如果設置為WARN,則低于WARN的信息都不會輸出 -->
    <!-- scan:當此屬性設置為true時厘灼,配置文件如果發(fā)生改變夹纫,將會被重新加載,默認值為true -->
    <!-- scanPeriod:設置監(jiān)測配置文件是否有修改的時間間隔设凹,如果沒有給出時間單位舰讹,默認單位是毫秒。當scan為true時闪朱,此屬性生效月匣。默認的時間間隔為1分鐘。 -->
    <!-- debug:當此屬性設置為true時奋姿,將打印出logback內部日志信息锄开,實時查看logback運行狀態(tài)。默認值為false称诗。 -->
    <contextName>logback</contextName>
    <!-- name的值是變量的名稱萍悴,value的值時變量定義的值。通過定義的值會被插入到logger上下文中寓免。定義變量后退腥,可以使“${}”來使用變量。 -->
    <property name="log.path" value="log" />
    <property name="console_log_pattern"
              value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
    <property name="charset" value="UTF-8"/>
    <!--輸出到控制臺-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是為開發(fā)使用再榄,只配置最底級別狡刘,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
        <!-- 例如:如果此處配置了INFO級別,則后面其他位置即使配置了DEBUG級別的日志困鸥,也不會被輸出 -->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>DEBUG</level>
         </filter>
        <encoder>
            <pattern>${console_log_pattern}</pattern>
        </encoder>
    </appender>

    <!--輸出到文件,只記錄INFO級別信息-->
    <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/roll_info/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>${console_log_pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
        <!-- 日志記錄器的滾動策略嗅蔬,按日期剑按,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志歸檔路徑以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天數-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 如果超過10MB就刪除 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>10MB</maxFileSize>
        </triggeringPolicy>
        <!-- 此日志文件只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--輸出到文件,只記錄WARN級別信息-->
    <appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    </appender>
    <!--輸出到文件,只記錄ERROR級別信息-->
    <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    </appender>

    <!--
    root節(jié)點是必選節(jié)點,用來指定最基礎的日志輸出級別澜术,只有一個level屬性
    level:用來設置打印級別艺蝴,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默認是DEBUG
    可以包含零個或多個appender元素鸟废。
    -->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="info_file" />
        <appender-ref ref="warn_file"/>
        <appender-ref ref="error_file"/>
    </root>

    <!--
        <logger>用來設置某一個包或者具體的某一個類的日志打印級別猜敢、以及指定<appender>。
        <logger>僅有一個name屬性盒延,
        一個可選的level和一個可選的additivity屬性缩擂。
        name:用來指定受此logger約束的某一個包或者具體的某一個類。
        level:用來設置打印級別添寺,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF胯盯,
              如果未設置此屬性,那么當前l(fā)ogger將會繼承上級的級別计露。
        additivity:是否向上級logger傳遞打印信息,默認是true
    -->
    <!-- 使用mybatis的時候博脑,sql語句是debug下才會打印,而這里我們只配置了info票罐,所以想要查看sql語句的話叉趣,有以下兩種操作:
         第一種把<root level="INFO">改成<root level="DEBUG">這樣就會打印sql,不過這樣日志那邊會出現很多其他消息
         第二種就是單獨給mapper下目錄配置DEBUG模式该押,代碼如下疗杉,這樣配置sql語句會打印,其他還是正常DEBUG級別:
    -->
    <logger name="com.hyh.logback.web.LogTestController" level="WARN" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="warn_file"/>
        <appender-ref ref="error_file"/>
    </logger>

    <!--    如果多環(huán)境開發(fā)可以用springProfile -->
    <!--開發(fā)環(huán)境:打印控制臺-->
    <springProfile name="dev">
        <!--可以輸出項目中的debug日志沈善,包括mybatis的sql日志-->
        <logger name="com.hyh.logback.web" level="DEBUG">
            <appender-ref ref="console"/>
        </logger>
        <!--
            root節(jié)點是必選節(jié)點乡数,用來指定最基礎的日志輸出級別,只有一個level屬性
            level:用來設置打印級別闻牡,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF净赴,默認是DEBUG
            可以包含零個或多個appender元素。
        -->
        <root level="INFO">
            <appender-ref ref="console"/>
        </root>
    </springProfile>
</configuration>

最終的效果罩润,會在項目路徑下生成日志文件:/log/info/log-info-2020-11-01.0.log玖翅,并且日志文件的策略也在xml中定義。

控制臺打印信息割以,如下圖所示:

log3.png

配置文件下載

本文內容均為對優(yōu)秀博客及官方文檔總結而得金度,原文地址均已在文中參考閱讀處標注。最后严沥,文中的代碼及配置文件詳細樣例已經全部上傳至Gitee:https://gitee.com/tqbx/springboot-samples-learn

參考閱讀

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末猜极,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子消玄,更是在濱河造成了極大的恐慌跟伏,老刑警劉巖丢胚,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異受扳,居然都是意外死亡携龟,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門勘高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峡蟋,“玉大人,你說我怎么就攤上這事华望∪锘龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵立美,是天一觀的道長匿又。 經常有香客問我方灾,道長建蹄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任裕偿,我火速辦了婚禮洞慎,結果婚禮上,老公的妹妹穿的比我還像新娘嘿棘。我一直安慰自己劲腿,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布鸟妙。 她就那樣靜靜地躺著焦人,像睡著了一般。 火紅的嫁衣襯著肌膚如雪重父。 梳的紋絲不亂的頭發(fā)上花椭,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音房午,去河邊找鬼矿辽。 笑死,一個胖子當著我的面吹牛郭厌,可吹牛的內容都是我干的袋倔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼折柠,長吁一口氣:“原來是場噩夢啊……” “哼宾娜!你這毒婦竟也來了?” 一聲冷哼從身側響起扇售,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤前塔,失蹤者是張志新(化名)和其女友劉穎贾陷,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體嘱根,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡髓废,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了该抒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慌洪。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凑保,靈堂內的尸體忽然破棺而出冈爹,到底是詐尸還是另有隱情,我是刑警寧澤欧引,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布频伤,位于F島的核電站,受9級特大地震影響芝此,放射性物質發(fā)生泄漏憋肖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一婚苹、第九天 我趴在偏房一處隱蔽的房頂上張望岸更。 院中可真熱鬧,春花似錦膊升、人聲如沸怎炊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽评肆。三九已至,卻和暖如春非区,著一層夾襖步出監(jiān)牢的瞬間瓜挽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工院仿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秸抚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓歹垫,卻偏偏與公主長得像剥汤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子排惨,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355