Spring Boot學習之旅:(七)logback配置日志

本編文章主要介紹:
如何引入日志苍息?
日志輸出格式以及輸出方式如何配置庄敛?
代碼中如何使用伟叛?
Spring Boot在所有內(nèi)部日志中使用Commons Logging略就,但是默認配置也提供了對常用日志的支持兄墅,如:Java Util Logging踢星,Log4J, Log4J2和Logback。每種Logger都可以通過配置使用控制臺或者文件輸出日志內(nèi)容隙咸。
默認情況下沐悦,Spring Boot會用Logback來記錄日志,并用INFO級別輸出到控制臺
SLF4J——Simple Logging Facade For Java五督,它是一個針對于各類Java日志框架的統(tǒng)一Facade抽象藏否。Java日志框架眾多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)充包。而SLF4J定義了統(tǒng)一的日志抽象接口副签,而真正的日志實現(xiàn)則是在運行時決定的——它提供了各類日志框架的binding。
Logback是log4j框架的作者開發(fā)的新一代日志框架,它效率更高淆储、能夠適應(yīng)諸多的運行環(huán)境冠场,同時天然支持SLF4J。

1.如何引入日志

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

只需要引入 spring-boot -starter-logging 即可如果已經(jīng)引入spring-boot-starter則不需要再引入logging因為其中已經(jīng)包含logging引用本砰。如下圖所示
[圖片上傳失敗...(image-66dc51-1522074332943)]

2.日志輸出格式以及輸出方式如何配置

創(chuàng)建一個logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan 配置文件如果發(fā)生改變慈鸠,將會被重新加載  scanPeriod 檢測間隔時間-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>spring-boot-log</contextName>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <!-- 普通日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>log/spring-boot-log-info.log</file>
        <!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志命名:單個文件大于128MB 按照時間+自增i 生成log文件 -->
            <fileNamePattern>log/spring-boot-log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>128MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 最大保存時間:30天-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
     <!-- 錯誤日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>log/spring-boot-log-error.log</file>
        <!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志命名:單個文件大于2MB 按照時間+自增i 生成log文件 -->
            <fileNamePattern>log/spring-boot-log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 最大保存時間:180天-->
            <maxHistory>180</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <!-- 日志格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 日志級別過濾器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <!-- 過濾的級別 -->
             <level>ERROR</level>
             <!-- 匹配時的操作:接收(記錄) -->
             <onMatch>ACCEPT</onMatch>
             <!-- 不匹配時的操作:拒絕(不記錄) -->
             <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 控制臺 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--此日志appender是為開發(fā)使用,只配置最底級別灌具,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>
    <!-- additivity 避免執(zhí)行2次 -->
    <logger name="com.wen"  level="INFO"  additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</configuration>

下面對節(jié)點屬性做一個簡單的介紹
根節(jié)點<configuration>包含的屬性
scan:當此屬性設(shè)置為true時青团,配置文件如果發(fā)生改變,將會被重新加載咖楣,默認值為true督笆。
scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位诱贿,默認單位是毫秒娃肿。當scan為true時,此屬性生效珠十。默認的時間間隔為1分鐘料扰。
debug:當此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息焙蹭,實時查看logback運行狀態(tài)晒杈。默認值為false。
根節(jié)點<configuration>的子節(jié)點:
<configuration>下面一共有2個屬性孔厉,3個子節(jié)點拯钻,分別是:
屬性一:設(shè)置上下文名稱<contextName>
<contextName>spring-boot-log</contextName>
每個logger都關(guān)聯(lián)到logger上下文,默認上下文名稱為“default”撰豺。但可以使用設(shè)置成其他名字粪般,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置污桦,不能修改,可以通過%contextName來打印日志上下文名稱亩歹。
屬性二:設(shè)置變量<property>
用來定義變量值的標簽, 有兩個屬性凡橱,name和value小作;其中name的值是變量的名稱,value的值時變量定義的值梭纹。通過定義的值會被插入到logger上下文中躲惰。定義變量后,可以使“${}”來使用變量变抽。
<property name="path" value="H:\\boot/log.log" />
子節(jié)點一<appender>
appender用來格式化日志輸出節(jié)點础拨,有倆個屬性name和class氮块,class用來指定哪種輸出策略,常用就是控制臺輸出策略和文件輸出策略诡宗。
控制臺

   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--此日志appender是為開發(fā)使用滔蝉,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

ThresholdFilter為系統(tǒng)定義的攔截器塔沃,例如我們用ThresholdFilter來過濾掉ERROR級別以下的日志不輸出到文件中蝠引。如果不用記得注釋掉,不然你控制臺會發(fā)現(xiàn)沒日志
輸出到文件RollingFileAppender
另一種常見的日志輸出到文件蛀柴,隨著應(yīng)用的運行時間越來越長螃概,日志也會增長的越來越多,將他們輸出到同一個文件并非一個好辦法鸽疾。RollingFileAppender用于切分文件日志:

    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>log/spring-boot-log-info.log</file>
        <!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志命名:單個文件大于128MB 按照時間+自增i 生成log文件 -->
            <fileNamePattern>log/spring-boot-log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>128MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 最大保存時間:30天-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

子節(jié)點二<root>
root節(jié)點是必選節(jié)點吊洼,用來指定最基礎(chǔ)的日志輸出級別,只有一個level屬性制肮。
level:用來設(shè)置打印級別冒窍,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設(shè)置為INHERITED或者同義詞NULL豺鼻。
默認是DEBUG综液。
可以包含零個或多個元素,標識這個appender將會添加到這個loger儒飒。

 <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>

子節(jié)點三<loger>

  <logger name="com.itstyle"  level="INFO"  additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </logger>

name:用來指定受此loger約束的某一個包或者具體的某一個類谬莹。
level:用來設(shè)置打印級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF约素,還有一個特俗值INHERITED或者同義詞NULL届良,代表強制執(zhí)行上級的級別。如果未設(shè)置此屬性圣猎,那么當前l(fā)oger將會繼承上級的級別。

3代碼中如何使用

使用的話只需要在使用的類中加入
private Logger logger = LoggerFactory.getLogger(this.getClass());
logger.info("index");
輸出日志既可運行項目發(fā)現(xiàn)

這里寫圖片描述

已經(jīng)生成了這兩個log文件

4.對于Logback的簡單說明:

1乞而、Logback為取代log4j而生

 Logback是由log4j創(chuàng)始人Ceki Gülcü設(shè)計的又一個開源日志組件送悔。logback當前分成三個模塊:logback-core,logback- classic和logback-access。

2爪模、Logback的核心對象:Logger欠啤、Appender、Layout

 Logback主要建立于Logger屋灌、Appender 和 Layout 這三個類之上洁段。

1 :  Logger:日志的記錄器,把它關(guān)聯(lián)到應(yīng)用的對應(yīng)的context上后共郭,主要用于存放日志對象祠丝,也可以定義日志類型疾呻、級別。Logger對象一般多定義為靜態(tài)常量写半,如:     

2: Appender:用于指定日志輸出的目的地岸蜗,目的地可以是控制臺,文件叠蝇,遠程套接字璃岳,Mysql,PostreSQL悔捶,Oracle铃慷,和其他數(shù)據(jù)庫

3:layout:負責把時間轉(zhuǎn)換成字符串,格式話的日志信息的輸出.

3 Level的幼小的級別蜕该,Logger可以分配級別犁柜,級別包括:trace,Debug蛇损,Info赁温,Warn,和Error淤齐,定義于

ch.qos.logback.classic.Level類股囊,程序會打印高于或者等于所設(shè)置級別的izhi,設(shè)置級別的日志等級越高更啄,打印出來的日

志就越少稚疹,如果設(shè)置級別為info的日志信息可以被輸出,小于該級別的如DEBUG不會被輸出祭务,為確保所有l(wèi)ogger都能最

終繼承一個級別内狗,因此根的logger也總是有級別,一般而言义锥,這個級別是DEBUG

4:三值邏輯

    在logback的過濾器基于三值邏輯柳沙,允許把他們組裝成為鏈條,從而組裝成任意符合過濾策略拌倍,過濾器很大的程度上受到了 iptables的啟發(fā)赂鲤,這里所謂三值邏輯是說:

如果返回Deny, 那么記錄時間立即被拋棄柱恤,不在經(jīng)過剩余的過濾器

如果返回Neutral数初,那么有序列表里的下一個過濾器會接著處理記錄事件 

 如果返回Accept,那么記錄時間被立即處理梗顺,不再經(jīng)過剩余的過濾器

5 Filter 過濾
logback-classic 提供兩種類型的過濾:

5.1: 常規(guī)過濾器
5.2:TuroboFilter過濾器
參考文章:http://tengj.top/2017/04/05/springboot7/
文章鏈接:http://www.haha174.top/article/details/252573
源碼鏈接:https://github.com/haha174/boot.git
推薦一篇文章:http://mp.weixin.qq.com/s?__biz=MzA3MTU0MDg2OQ==&mid=2247483731&idx=1&sn=35332c0e058d02cacbacd30707db9a5a&chksm=9f2d48b9a85ac1af4dc84ee7fccdecd1be010f82f13a40c78516cb488965b24e8d427e93fb23&mpshare=1&scene=23&srcid=1015ORKoX6SDjipznhzALSvc#rd
歡迎關(guān)注泡孩,更多福利


這里寫圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寺谤,隨后出現(xiàn)的幾起案子仑鸥,更是在濱河造成了極大的恐慌吮播,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈候,死亡現(xiàn)場離奇詭異薄料,居然都是意外死亡,警方通過查閱死者的電腦和手機泵琳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門摄职,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人获列,你說我怎么就攤上這事谷市。” “怎么了击孩?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵迫悠,是天一觀的道長。 經(jīng)常有香客問我巩梢,道長创泄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任括蝠,我火速辦了婚禮鞠抑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忌警。我一直安慰自己搁拙,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布法绵。 她就那樣靜靜地躺著箕速,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朋譬。 梳的紋絲不亂的頭發(fā)上盐茎,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音徙赢,去河邊找鬼庭呜。 笑死,一個胖子當著我的面吹牛犀忱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扶关,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼阴汇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了节槐?” 一聲冷哼從身側(cè)響起搀庶,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拐纱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哥倔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秸架,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年咆蒿,在試婚紗的時候發(fā)現(xiàn)自己被綠了东抹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡沃测,死狀恐怖缭黔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒂破,我是刑警寧澤馏谨,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站附迷,受9級特大地震影響惧互,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喇伯,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一喊儡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艘刚,春花似錦管宵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秋度,卻和暖如春炸庞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荚斯。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工埠居, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人事期。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓滥壕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兽泣。 傳聞我的和親對象是個殘疾皇子绎橘,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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