對於一個web項目來講,日誌框架是必不可少的,日誌的記錄能夠幫助咱們在開發以及維護過程當中快速的定位錯誤。相信不少人據說過slf4j
,log4j
,logback
,JDK Logging
等跟日誌框架有關的詞語,因此這裏也簡單介紹下他們之間的關係。php
文章首發於我的博客:【www.xiongfrblog.cn】html
首先slf4j
能夠理解爲規則的制定者,是一個抽象層,定義了日誌相關的接口。log4j
,logback
,JDK Logging
都是slf4j
的實現層,只是出處不一樣,固然使用起來也就各有千秋,這裏放一張網上的圖更明瞭的解釋了他們之間的關係:java
能夠看到logback
是直接實現的slf4j
,而其餘的中間還有一個適配層,至於緣由也很簡單,由於logback
和slf4j
的做者是一我的。關於這幾個框架詳細介紹信息,在網上找到一篇講解的通俗易懂的文章,感興趣的朋友能夠了解下【傳送門】程序員
我使用這個框架是由於一開始接觸的時候就用的這個,後來在網上了解到slf4j
+logback
也確實當下最流行的日誌框架,而且本身用着也確實很順手,也就一直用了下來,關於這個框架相比於其它日誌框架的優點,由於我沒用過其它的框架,這裏也就不作那誤人子弟的事了,也只是在網上作過了解,這裏給出一篇介紹的比較詳細的博文【傳送門】web
在Spring boot
使用是很是方便的,不須要咱們有什麼額外的配置,由於Spring boot
默認支持的就是slf4j
+logback
的日誌框架,想要靈活的定製日誌策略,只須要咱們在src/main/resources
下添加配置文件便可,只是默認狀況下配置文件的命名須要符合如下規則:spring
其中
logback-spring.xml
是官方推薦的,而且只有使用這種命名規則,才能夠配置不一樣環境使用不一樣的日誌策略這一功能。數組
首先介紹配置文件的關鍵節點:springboot
<configuration>
:根節點,有三個屬性:app
scan
:當配置文件發生修改時,是否從新加載該配置文件,兩個可選值true
or false
,默認爲true
。scanPeriod
:檢測配置文件是否修改的時間週期,當沒有給出時間單位時默認單位爲毫秒,默認值爲一分鐘,須要注意的是這個屬性只有在scan
屬性值爲true
時才生效。debug
:是否打印loback
內部日誌信息,兩個可選值true
or false
,默認爲false
。根節點<configuration>
有三個重要的子節點,正是這三個子節點的不一樣組合構成配置文件的基本框架,使得logback.xml
配置文件具有很強的靈活性:框架
<appender>
:定義日誌策略的節點,一個日誌策略對應一個<appender>
,一個配置文件中能夠有零個或者多該節點,但一個配置文件若是沒有定義至少一個<appender>
,雖然程序不會報錯,但就不會有任何的日誌信息輸出,也失去了意義,該節點有兩個必要的屬性:
name
:指定該節點的名稱,方便以後的引用。class
:指定該節點的全限定名,所謂的全限定名就是定義該節點爲哪一種類型的日誌策略,好比咱們須要將日誌輸出到控制檯,就須要指定class
的值爲ch.qos.logback.core.ConsoleAppender
;須要將日誌輸出到文件,則class
的值爲ch.qos.logback.core.FileAppender
等,想要了解全部的appender
類型,能夠查閱官方文檔【傳送門】<logger>
:用來設置某個包或者類的日誌打印級別,而且能夠引用<appender>
綁定日誌策略,有三個屬性:
name
:用來指定受此<logger>
約束的包或者類。level
:可選屬性,用來指定日誌的輸出級別,若是不設置,那麼當前<logger>
會繼承上級的級別。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>
的時候仍是頗有用的:
name
:變量名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{}
的形式,使用默認的參數時能夠省略{}
,能夠定義一個整形的參數來控制輸出名稱的長度,有下面三種狀況:
<logger>
名稱0
表示只輸出<logger>
最右邊點號以後的字符串%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>
:兩個值true
和false
,默認爲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
,即負責滾動也負責觸發滾動,有如下經常使用子節點:
<fileNamePattern>
:指定日誌的路徑以及日誌文件名的命名規則,通常根據日誌文件名+%d{}.log
來命名,這邊日期的格式默認爲yyyy-MM-dd
表示天天生成一個文件,即按天滾動yyyy-MM
,表示每月生成一個文件,即按月滾動<maxHistory>
:可選節點,控制保存的日誌文件的最大數量,超出數量就刪除舊文件,好比設置天天滾動,且<maxHistory>
是7,則只保存最近7天的文件,刪除以前的舊文件<encoder>
:同上<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%
容量,他將丟棄TRACE
、DEBUG
和INFO
級別的日誌,只保留WARN
和ERROR
級別的日誌。爲了保持全部的日誌,設置該值爲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>
的順序無關。
上邊咱們定義了logger1
和logger2
,很明顯看出logger1
是logger2
的父級,以本例給出多個<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
屬性的值,在配置文件裏邊配置好以後,怎麼啓用,這裏介紹兩種方式:
jar
包時添加參數:java -jar xxx.jar --spring.profiles.active=prod
複製代碼
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
。
有差很少一個月的時間沒有更新了,春節期間休息沒寫,節後一直加班,天天到家都差很少十點多了,從上週開始天天抽點時間寫完這一篇博客,自認爲寫的還算詳細,一方面是本身的加深印象,由於這一類的配置文件在實際的項目中不會每次都去配置,就拷貝粘貼一直用的,不少概念也早就忘記了,藉着此次機會本身再鞏固下,分享出來但願能對更多的人有點幫助吧。