Spring boot學習(七)Spring boot配置slf4j+logback日誌框架

前言

對於一個web項目來講,日誌框架是必不可少的,日誌的記錄能夠幫助咱們在開發以及維護過程當中快速的定位錯誤。相信不少人據說過slf4j,log4j,logback,JDK Logging等跟日誌框架有關的詞語,因此這裏也簡單介紹下他們之間的關係。php

文章首發於我的博客:【www.xiongfrblog.cnhtml

關係

首先slf4j能夠理解爲規則的制定者,是一個抽象層,定義了日誌相關的接口。log4j,logback,JDK Logging都是slf4j的實現層,只是出處不一樣,固然使用起來也就各有千秋,這裏放一張網上的圖更明瞭的解釋了他們之間的關係:java

在這裏插入圖片描述

能夠看到logback是直接實現的slf4j,而其餘的中間還有一個適配層,至於緣由也很簡單,由於logbackslf4j的做者是一我的。關於這幾個框架詳細介紹信息,在網上找到一篇講解的通俗易懂的文章,感興趣的朋友能夠了解下【傳送門】程序員

爲何使用slf4j+logback

我使用這個框架是由於一開始接觸的時候就用的這個,後來在網上了解到slf4j+logback也確實當下最流行的日誌框架,而且本身用着也確實很順手,也就一直用了下來,關於這個框架相比於其它日誌框架的優點,由於我沒用過其它的框架,這裏也就不作那誤人子弟的事了,也只是在網上作過了解,這裏給出一篇介紹的比較詳細的博文【傳送門】web

在Spring boot中使用slf4j+logback日誌框架

添加配置文件

Spring boot使用是很是方便的,不須要咱們有什麼額外的配置,由於Spring boot默認支持的就是slf4j+logback的日誌框架,想要靈活的定製日誌策略,只須要咱們在src/main/resources下添加配置文件便可,只是默認狀況下配置文件的命名須要符合如下規則:spring

  • logback.xml
  • logback-spring.xml

其中logback-spring.xml是官方推薦的,而且只有使用這種命名規則,才能夠配置不一樣環境使用不一樣的日誌策略這一功能。數組

配置文件詳解

首先介紹配置文件的關鍵節點:springboot

框架介紹

<configuration>:根節點,有三個屬性:app

  1. scan:當配置文件發生修改時,是否從新加載該配置文件,兩個可選值true or false,默認爲true
  2. scanPeriod:檢測配置文件是否修改的時間週期,當沒有給出時間單位時默認單位爲毫秒,默認值爲一分鐘,須要注意的是這個屬性只有在scan屬性值爲true時才生效。
  3. debug:是否打印loback內部日誌信息,兩個可選值true or false,默認爲false

根節點<configuration>有三個重要的子節點,正是這三個子節點的不一樣組合構成配置文件的基本框架,使得logback.xml配置文件具有很強的靈活性:框架

  • <appender>:定義日誌策略的節點,一個日誌策略對應一個<appender>,一個配置文件中能夠有零個或者多該節點,但一個配置文件若是沒有定義至少一個<appender>,雖然程序不會報錯,但就不會有任何的日誌信息輸出,也失去了意義,該節點有兩個必要的屬性:

    1. name:指定該節點的名稱,方便以後的引用。
    2. class:指定該節點的全限定名,所謂的全限定名就是定義該節點爲哪一種類型的日誌策略,好比咱們須要將日誌輸出到控制檯,就須要指定class的值爲ch.qos.logback.core.ConsoleAppender;須要將日誌輸出到文件,則class的值爲ch.qos.logback.core.FileAppender等,想要了解全部的appender類型,能夠查閱官方文檔【傳送門】
  • <logger>:用來設置某個包或者類的日誌打印級別,而且能夠引用<appender>綁定日誌策略,有三個屬性:

    1. name:用來指定受此<logger>約束的包或者類。
    2. level:可選屬性,用來指定日誌的輸出級別,若是不設置,那麼當前<logger>會繼承上級的級別。
    3. additivity:是否向上級傳遞輸出信息,兩個可選值true or false,默認爲true

在該節點內能夠添加子節點<appender-ref>,該節點有一個必填的屬性ref,值爲咱們定義的<appender>節點的name屬性的值。

  • <root>:根<logger>一個特殊的<logger>,即默認name屬性爲root<logger>,由於是根<logger>,因此不存在向上傳遞一說,故沒有additivity屬性,因此該節點只有一個level屬性。

介紹了根節點的三個主要的子節點,下面再介紹兩個不那麼重要但能夠了解的子節點:

  • <contextName>:設置上下文名稱,每一個<logger>都關聯到<logger>上下文,默認上下文名稱爲default,但可使用設置成其餘名字,用於區分不一樣應用程序的記錄,一旦設置,不能修改,能夠經過 %contextName 來打印日誌上下文名稱,通常來講咱們不用這個屬性,無關緊要。
  • <property>:用來定義變量的節點,定義變量後,可使${}來使用變量,兩個屬性,當定義了多個<appender>的時候仍是頗有用的:
    1. name:變量名
    2. value:變量值

好了,介紹了上邊的節點咱們就已經能夠搭建一個簡單的配置文件框架了,以下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 通常根節點不須要寫屬性了,使用默認的就好 -->
<configuration>

    <contextName>demo</contextName>
    
    <!-- 該變量表明日誌文件存放的目錄名 -->
    <property name="log.dir" value="logs"/>
    <!-- 該變量表明日誌文件名 -->
	<property name="log.appname" value="eran"/>
    
    <!--定義一個將日誌輸出到控制檯的appender,名稱爲STDOUT -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 內容待定 -->
    </appender>
    
    <!--定義一個將日誌輸出到文件的appender,名稱爲FILE_LOG -->
    <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">
        <!-- 內容待定 -->
    </appender>
  
    <!-- 指定com.demo包下的日誌打印級別爲INFO,可是因爲沒有引用appender,因此該logger不會打印日誌信息,日誌信息向上傳遞 -->
    <logger name="com.demo" level="INFO"/>
  
    <!-- 指定最基礎的日誌輸出級別爲DEBUG,而且綁定了名爲STDOUT的appender,表示將日誌信息輸出到控制檯 -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
複製代碼

上面搭建了框架,定義了一個輸出到控制檯的ConsoleAppender以及輸出到文件的FileAppender,下面來細說這兩個最基本的日誌策略,並介紹最經常使用的滾動文件策略的RollingFileAppender,這三種類型的日誌策略足夠咱們的平常使用。

輸出到控制檯的ConsoleAppender的介紹:

先給出一個demo

<!--定義一個將日誌輸出到控制檯的appender,名稱爲STDOUT -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
    </encoder>
</appender>

複製代碼

ConsoleAppender的功能是將日誌輸出到控制檯,有一個<encoder>節點用來指定日誌的輸出格式,在較早之前的版本還有一個<layout>節點也是相同的做用,可是官方推薦使用encoder節點,因此這裏咱們介紹encoder節點便可。

<encoder>節點介紹

該節點主要作兩件事:

  • 把日誌信息轉換成字節數組
  • 將字節數組寫到輸出流

該節點的子節點<pattern>做用就是定義日誌的格式,即定義一條日誌信息包含哪些內容,例如當前時間,在代碼中的行數線程名等。須要哪些內容由咱們本身定義,按照%+轉換符的格式定義,下面列出經常使用的轉換符:

  • %date{}:輸出時間,能夠在花括號內指定時間格式,例如-%data{yyyy-MM-dd HH:mm:ss},格式語法和java.text.SimpleDateFormat同樣,能夠簡寫爲%d{}的形式,使用默認的格式時能夠省略{}
  • %logger{}:日誌的logger名稱,能夠簡寫爲%c{},%lo{}的形式,使用默認的參數時能夠省略{},能夠定義一個整形的參數來控制輸出名稱的長度,有下面三種狀況:
    1. 不輸入表示輸出完整的<logger>名稱
    2. 輸入0表示只輸出<logger>最右邊點號以後的字符串
    3. 輸入其餘數字表示輸出小數點最後邊點號以前的字符數量
  • %thread:產生日誌的線程名,可簡寫爲%t
  • %line:當前打印日誌的語句在程序中的行號,可簡寫爲%L
  • %level:日誌級別,可簡寫爲%le,%p
  • %message:程序員定義的日誌打印內容,可簡寫爲%msg,%m
  • %n:換行,即一條日誌信息佔一行

介紹了經常使用的轉換符,咱們再看看上邊的例子中咱們定義的格式:

<pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
複製代碼

日誌的格式一目瞭然,能夠看出咱們在最前面加了[eran]的字符串,這裏是我我的的使用習慣,通常將項目名統一展示在日誌前邊,並且在每一個轉換符之間加了空格,這更便於咱們查看日誌,而且使用了>>字符串來將%msg分割開來,更便於咱們找到日誌信息中咱們關注的內容,這些東西你們能夠本身按照本身的喜愛來。

輸出到文件的FileAppender

先給出一個demo

<!--定義一個將日誌輸出到文件的appender,名稱爲FILE_LOG -->
<appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">  
    <file>D:/test.log</file>
    <append>true</append>  
    <encoder>  
        <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
    </encoder>
</appender>
複製代碼

FileAppender表示將日誌輸出到文件,經常使用幾個子節點:

  • <file>:定義文件名和路徑,能夠是相對路徑 , 也能夠是絕對路徑 , 若是路徑不存在則會自動建立
  • <append>:兩個值truefalse,默認爲true,表示每第二天志輸出到文件走追加在原來文件的結尾,false則表示清空現存文件
  • <encoder>:和ConsoleAppender同樣

顯而易見,樣例中咱們的日誌策略表示,每次將日誌信息追加到D:/test.log的文件中。

滾動文件策略RollingFileAppender介紹

按時間滾動TimeBasedRollingPolicy

demo以下:

<appender name="ROL-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
  <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  	<fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.log</fileNamePattern>
  	<!-- 只保留近七天的日誌 -->
  	<maxHistory>7</maxHistory>
  	<!-- 用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌 -->
  	<totalSizeCap>1GB</totalSizeCap>
  </rollingPolicy> 
  
  <encoder>
	<pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
  </encoder>
</appender>
複製代碼

RollingFileAppender是很是經常使用的一種日誌類型,表示滾動紀錄文件,先將日誌記錄到指定文件,當符合某種條件時,將日誌記錄到其餘文件,經常使用的子節點:

  • <rollingPolicy>:滾動策略,經過屬性class來指定使用什麼滾動策略,最經常使用是按時間滾動TimeBasedRollingPolicy,即負責滾動也負責觸發滾動,有如下經常使用子節點:

    1. <fileNamePattern>:指定日誌的路徑以及日誌文件名的命名規則,通常根據日誌文件名+%d{}.log來命名,這邊日期的格式默認爲yyyy-MM-dd表示天天生成一個文件,即按天滾動yyyy-MM,表示每月生成一個文件,即按月滾動
    2. <maxHistory>:可選節點,控制保存的日誌文件的最大數量,超出數量就刪除舊文件,好比設置天天滾動,且<maxHistory> 是7,則只保存最近7天的文件,刪除以前的舊文件
    3. <encoder>:同上
    4. <totalSizeCap>:這個節點表示設置全部的日誌文件最多佔的內存大小,當超過咱們設置的值時,logback就會刪除最先建立的那一個日誌文件。

以上就是關於RollingFileAppender的經常使用介紹,上面的demo的配置也基本知足了咱們按照時間滾動TimeBasedRollingPolicy生成日誌的要求,下面再介紹一種經常使用的滾動類型SizeAndTimeBasedRollingPolicy,即按照時間和大小來滾動。

按時間和大小滾動SizeAndTimeBasedRollingPolicy

demo以下:

<appender name="ROL-SIZE-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <!-- 單個文件的最大內存 -->
        <maxFileSize>100MB</maxFileSize>
        <!-- 只保留近七天的日誌 -->
        <maxHistory>7</maxHistory>
        <!-- 用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌 -->
        <totalSizeCap>1GB</totalSizeCap>
    </rollingPolicy>
    
    <encoder>
        <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
    </encoder>
</appender>
複製代碼

仔細觀察上邊demo中的<fileNamePattern>會發現比TimeBasedRollingPolicy中定義的<fileNamePattern>多了.%i的字符,這個很關鍵,在SizeAndTimeBasedRollingPolicy中是必不可少的。

上邊的demo中多了一個<maxFileSize>節點,這裏介紹下,其餘的節點上邊已經解釋過,這裏就再也不贅述。

<maxFileSize>:表示單個文件佔用的最大內存大小,當某個文件超過這個值,就會觸發滾動策略,產生一個新的日誌文件。

日誌過濾

級別介紹

在說級別過濾以前,先介紹一下日誌的級別信息:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR

上述級別從上到下由低到高,咱們開發測試通常輸出DEBUG級別的日誌,生產環境配置只輸出INFO級別甚至只輸出ERROR級別的日誌,這個根據狀況而定,很靈活。

過濾節點<filter>介紹

過濾器一般配置在Appender中,一個Appender能夠配置一個或者多個過濾器,有多個過濾器時按照配置順序依次執行,固然也能夠不配置,其實大多數狀況下咱們都不須要配置,可是有的狀況下又必須配置,因此這裏也介紹下經常使用的也是筆者曾經使用過的兩種過率機制:級別過濾器LevelFilter和臨界值過濾器ThresholdFilter

在此以前先說下<filter>的概念,首先一個過濾器<filter>的全部返回值有三個,每一個過濾器都只返回下面中的某一個值:

  • DENY:日誌將被過濾掉,而且不通過下一個過濾器
  • NEUTRAL:日誌將會到下一個過濾器繼續過濾
  • ACCEPT:日誌被當即處理,再也不進入下一個過濾器
級別過濾器LevelFilter

過濾條件:只處理INFO級別的日誌,格式以下:

<filter class="ch.qos.logback.classic.filter.LevelFilter">   
    <level>INFO</level>   
    <onMatch>ACCEPT</onMatch>   
    <onMismatch>DENY</onMismatch>   
</filter>
複製代碼
  • <level>:日誌級別
  • <onMatch>:配置知足過濾條件的處理方式
  • <onMismatch>:配置不知足過濾條件的處理方式

就如上邊的demo中的配置同樣,設置了級別爲INFO,知足的日誌返回ACCEPT即當即處理,不知足條件的日誌則返回DENY即丟棄掉,這樣通過這一個過濾器就只有INFO級別的日誌會被打印出輸出。

臨界值過濾器ThresholdFilter

過濾條件:只處理INFO級別之上的日誌,格式以下:

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">   
    <level>INFO</level>   
</filter>
複製代碼

當日志級別等於或高於臨界值時,過濾器返回NEUTRAL,當日志級別低於臨界值時,返回DENY

帶過濾器的<Appender>

下面給出一個帶過濾器的<Appender>:

<appender name="ROL-SIZE-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <!-- 單個文件的最大內存 -->
        <maxFileSize>100MB</maxFileSize>
        <!-- 只保留近七天的日誌 -->
        <maxHistory>7</maxHistory>
        <!-- 用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌 -->
        <totalSizeCap>1GB</totalSizeCap>
    </rollingPolicy>
    
    <encoder>
        <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
    </encoder>
    
    <!-- 只處理INFO級別以及之上的日誌 -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">   
        <level>INFO</level>   
    </filter>
    
    <!-- 只處理INFO級別的日誌 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">   
        <level>INFO</level>   
        <onMatch>ACCEPT</onMatch>   
        <onMismatch>DENY</onMismatch>   
    </filter>
</appender>
複製代碼

上邊的demo中,咱們給按時間和大小滾動SizeAndTimeBasedRollingPolicy的滾動類型加上了過濾條件。

異步寫入日誌AsyncAppender

都知道,咱們的日誌語句是嵌入在程序內部,若是寫入日誌以及程序執行的處於一個串行的狀態,那麼日誌的記錄就必然會阻礙程序的執行,加長程序的響應時間,無疑是一種極爲損耗效率的方式,因此實際的項目中咱們的日誌記錄通常都用異步的方式來記錄,這樣就和主程序造成一種並行的狀態,不會影響咱們程序的運行,這也是咱們性能調優須要注意的一個點。

AsyncAppender並不處理日誌,只是將日誌緩衝到一個BlockingQueue裏面去,並在內部建立一個工做線程從隊列頭部獲取日誌,以後將獲取的日誌循環記錄到附加的其餘appender上去,從而達到不阻塞主線程的效果。所以AsynAppender僅僅充當事件轉發器,必須引用另外一個appender來寫日誌。

<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
    <!-- 不丟失日誌.默認的,若是隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->  
    <discardingThreshold >0</discardingThreshold>  
    <!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 -->  
    <queueSize>512</queueSize>  
    <!-- 添加附加的appender,最多隻能添加一個 -->  
    <appender-ref ref ="FILE_LOG"/>
</appender>
複製代碼

經常使用節點:

  • <discardingThreshold>:默認狀況下,當BlockingQueue還有20%容量,他將丟棄TRACEDEBUGINFO級別的日誌,只保留WARNERROR級別的日誌。爲了保持全部的日誌,設置該值爲0
  • <queueSize>:BlockingQueue的最大容量,默認狀況下,大小爲256
  • <appender-ref>:添加附加的<appender>,最多隻能添加一個

<logger><root>節點介紹

上邊花費了很長的篇幅介紹了<appender>的相關內容,如今來詳細介紹下<logger>節點以及<root>節點的相關內容。

上文已經簡單介紹了<logger>節點的屬性以及子節點,這裏咱們就舉例來講明在logback-spring.xml文件中,該節點到底扮演怎樣的角色,以及他的運行原理,看下邊的demo

首先在這裏給出項目結構:

在這裏插入圖片描述

下面定義兩個<logger>以及<root>

<!-- logger1 -->
<logger name="com.example" level="ERROR">
	<appender-ref ref="STDOUT" />
</logger>

<!-- logger2 -->
<logger name="com.example.demo.controller" level="debug">
	<appender-ref ref="STDOUT" />
</logger>

<!-- 指定最基礎的日誌輸出級別爲DEBUG,而且綁定了名爲STDOUT的appender,表示將日誌信息輸出到控制檯 -->
<root level="INFO">
    <appender-ref ref="STDOUT" />
</root>
複製代碼

當存在多個<logger>時,會有父級子級的概念,日誌的處理流程是先子級再父級,固然<root>是最高級別,怎樣區分級別大小呢,根據name屬性指定的包名來判斷,包名級別越高則<logger>的級別越高,跟咱們定義<logger>的順序無關。

上邊咱們定義了logger1logger2,很明顯看出logger1logger2的父級,以本例給出多個<logger><root>之間的執行流程圖:

在這裏插入圖片描述

流程圖看着一目瞭然,這裏就再也不贅述,只是在實際的項目中咱們通常都不讓<logger>輸出日誌,統一放在<root>節點中輸出,因此通常不給<logger>節點添加<appender>,固然這個按實際須要能夠靈活配置。

配置profile

profile即根據不一樣的環境使用不一樣的日誌策略,這裏舉例開發和生產環境:

<!-- 開發環境輸出到控制檯 -->
<springProfile name="dev">
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</springProfile>

<!-- 生產環境輸出到文件 -->
<springProfile name="prod">
    <root level="INFO">
        <appender-ref ref="FILE_LOG" />
    </root>
</springProfile>
複製代碼

能夠看到咱們只須要在<root>節點的外邊再套一層<springProfile>就能夠了,而且指定name屬性的值,在配置文件裏邊配置好以後,怎麼啓用,這裏介紹兩種方式:

  1. 執行jar包時添加參數:
java -jar xxx.jar --spring.profiles.active=prod
複製代碼
  1. 在項目的application.properties配置文件中添加:
spring.profiles.active=prod
複製代碼

整合

最後將全部的模塊整合在一塊兒造成一個完整的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>    
    <!--定義一個將日誌輸出到控制檯的appender,名稱爲STDOUT -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%contextName]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
        </encoder>
    </appender> 
    
    <!--定義一個將日誌輸出到文件的appender,名稱爲FILE_LOG -->
    <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">  
        <file>D:/test.log</file>
        <append>true</append>  
        <encoder>  
            <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
        </encoder>
    </appender>  
    
    <!-- 按時間滾動產生日誌文件 -->
    <appender name="ROL-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      	<fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.log</fileNamePattern>
      	<!-- 只保留近七天的日誌 -->
      	<maxHistory>7</maxHistory>
      	<!-- 用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌 -->
      	<totalSizeCap>1GB</totalSizeCap>
      </rollingPolicy> 
      
      <encoder>
    	<pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
      </encoder>
    </appender>
    
    <!-- 按時間和文件大小滾動產生日誌文件 -->
    <appender name="ROL-SIZE-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 單個文件的最大內存 -->
            <maxFileSize>100MB</maxFileSize>
            <!-- 只保留近七天的日誌 -->
            <maxHistory>7</maxHistory>
            <!-- 用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌 -->
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        
        <encoder>
            <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
        </encoder>
        
        <!-- 只處理INFO級別以及之上的日誌 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">   
            <level>INFO</level>   
        </filter>
        
        <!-- 只處理INFO級別的日誌 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">   
            <level>INFO</level>   
            <onMatch>ACCEPT</onMatch>   
            <onMismatch>DENY</onMismatch>   
        </filter>
    </appender>
    
    <!-- 異步寫入日誌 -->
    <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
        <!-- 不丟失日誌.默認的,若是隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->  
        <discardingThreshold >0</discardingThreshold>  
        <!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 -->  
        <queueSize>512</queueSize>  
        <!-- 添加附加的appender,最多隻能添加一個 -->  
        <appender-ref ref ="FILE_LOG"/>
    </appender>
    
    
    <!-- 指定com.demo包下的日誌打印級別爲DEBUG,可是因爲沒有引用appender,因此該logger不會打印日誌信息,日誌信息向上傳遞 -->
    <logger name="com.example" level="DEBUG"></logger>
    <!-- 這裏的logger根據須要本身靈活配置 ,我這裏只是給出一個demo-->
    
    <!-- 指定開發環境基礎的日誌輸出級別爲DEBUG,而且綁定了名爲STDOUT的appender,表示將日誌信息輸出到控制檯 -->
    <springProfile name="dev">
        <root level="DEBUG">
            <appender-ref ref="STDOUT" />
        </root>
    </springProfile>
    
    <!-- 指定生產環境基礎的日誌輸出級別爲INFO,而且綁定了名爲ASYNC的appender,表示將日誌信息異步輸出到文件 -->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="ASYNC" />
        </root>
    </springProfile>
</configuration>
複製代碼

代碼中使用

終於到最後一步了,上邊介紹了怎麼配置logback-spring.xml配置文件,下面介紹怎麼在項目中引入日誌對象,以及怎麼使用它輸出日誌,直接上代碼:

package com.example.demo.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class TestLog {

	private final static Logger log = LoggerFactory.getLogger(TestLog.class);
	
	
	@RequestMapping(value="/log",method=RequestMethod.GET)
	public void testLog() {
		log.trace("trace級別的日誌");
		log.debug("debug級別日誌");
		log.info("info級別日誌");
		log.warn("warn級別的日誌");
		log.error("error級別日誌");
	}
}

複製代碼

在每個須要使用日誌對象的方法裏邊都要定義一次private final static Logger log = LoggerFactory.getLogger(xxx.class);其中xxx代指當前類名,若是以爲這樣很麻煩,也能夠經過@Slf4j註解的方式注入,可是這種方式須要添加pom依賴而且須要安裝lombok插件,這裏就不概述了,須要瞭解的朋友能夠本身google

結語

有差很少一個月的時間沒有更新了,春節期間休息沒寫,節後一直加班,天天到家都差很少十點多了,從上週開始天天抽點時間寫完這一篇博客,自認爲寫的還算詳細,一方面是本身的加深印象,由於這一類的配置文件在實際的項目中不會每次都去配置,就拷貝粘貼一直用的,不少概念也早就忘記了,藉着此次機會本身再鞏固下,分享出來但願能對更多的人有點幫助吧。

相關文章
相關標籤/搜索