javascript
SpringBoot笔记:SpringBoot2.3集成Logback日志组件配置
文章目錄
- Logback簡介
- 簡介
- 日志級別
- 日志分類
- Logback使用
- 添加依賴
- 配置Logback
- Logback參數解釋
- 1、根節點configuration包含屬性
- 2、根節點configuration的子節點
- 3、設置上下文名稱
- 3.1、默認方式contextName
- 3.2、默認方式property
- 3.3、獲取時間戳字符串:timestamp
- 4、設置loger、root
- 5、舉例說明
- 5.1、只配置root
- 5.2、帶有logger的配置,不指定界別,不指定appender
- 5.3、帶有多個logger的配置,指定級別,指定appender
Logback簡介
簡介
logback是繼log4j后的又一個日志框架,logback是springboot自帶的日志框架,logback以嚴格的日志級別區分不同級別的日志(其他日志都是繼承上一級的日志級別,例如:log4j2,log4j都是繼承更高級別的日志),logback分為三個模塊,logback-core,logback-classic,logback-access。
logback-core:logback-core是logback的核心模塊,是logback-classic和的logback-access的基礎。
logback-classic:實現了 slf4j API,配合 slf4j 使用,可以方便的切換其他日志框架。
logback-access:與Servlet容器(如Tomcat和Jetty)集成,提供了 HTTP 訪問日志接口。
日志級別
ALL > DEBUG > INFO > WARN > ERROR > OFF 級別越低,輸出日志越多,最低級別ALL,所有都輸出。最高級別是OFF(關閉),什么都不輸出。
- ALL:所有都輸出
- DEBUG:輸出DEBUG及后面所有日志
- INFO:輸出INFO及后面所有日志
- WARN:輸出WARN及后面所有日志
- ERROR:只輸出ERROR級別日志
日志分類
- 項目根日志:全局日志,一個項目只有一個根日志
- 項目子日志:包級別的日志,一個項目可以有多個子日志。
沒有特別指明的地方默認都用的是根日志規則,有子日志的地方用的是子日志的規則
Logback使用
添加依賴
對于一個web應用,只需要添加 spring-boot-starter-web依賴,因為它依賴了logging starter
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>springboot默認集成logback,不用額外引入jar包
logback延用了log4j所有語法和規則,熟悉log4j的話學習logback更加輕松
配置Logback
配置只需要在resources下添加logback-spring.xml配置文件就可以了。內容可以參考以下日志模板:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"><!-- 定義日志組件上下文路徑名,用于區分不同應用程序的記錄 --><contextName>springboot-logback</contextName><!--定義日志文件的存儲地址目錄 --><property name="LOG_HOME" value="./logs"/><!-- 控制臺輸出的配置 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern></encoder></appender><!-- 每天生成一個.log日志文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件輸出的文件名,我們使用的是路徑${LOG_HOME}+文件名(文件名里面加了日期) --><FileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.log</FileNamePattern><!--日志文件保留天數 --><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern></encoder><!--日志文件最大的大小,默認是10MB,超過這個就會備份為一個壓縮文件 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!-- 每天生成一個html格式的日志 --><appender name="HtmlFile" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件輸出的文件名 --><FileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.html</FileNamePattern><!--日志文件保留天數 --><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="ch.qos.logback.classic.html.HTMLLayout"><pattern>%p%d%msg%M%F{32}%L</pattern></layout></encoder><!--日志文件最大的大小 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!-- 生成html格式的WARN級別日志 --><appender name="WARNHtmlFile" class="ch.qos.logback.core.FileAppender"><!-- 過濾器,只記錄WARN級別的日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="ch.qos.logback.classic.html.HTMLLayout"><pattern>%p%d%msg%M%F{32}%L</pattern></layout></encoder><file>${LOG_HOME}/WARN-log.html</file></appender><!-- 根日志輸出級別 --><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="FILE"/><appender-ref ref="HtmlFile"/></root><!--自定義日志級別配置,指定我們項目都是debug級別 --><logger name="com.example.logback" level="debug"/> </configuration>Logback參數解釋
1、根節點configuration包含屬性
scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。
scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。
參考配置如下:
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 其他配置省略--> </configuration>2、根節點configuration的子節點
3、設置上下文名稱
3.1、默認方式contextName
每個logger都關聯到logger上下文,默認上下文名稱為“default”。但可以使用<contextName>設置成其他名字,用于區分不同應用程序的記錄。一旦設置,不能修改。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>springboot-logback</contextName> <!-- 其他配置省略--> </configuration>3.2、默認方式property
用來定義變量值的標簽,<property> 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過<property>定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量。
例如使用<property>定義上下文名稱,然后在<contentName>設置logger上下文時使用。
3.3、獲取時間戳字符串:timestamp
兩個屬性 key:標識此<timestamp> 的名字;datePattern:設置將當前時間(解析配置文件的時間)轉換為字符串的模式,遵循java.txt.SimpleDateFormat的格式。
例如將解析配置文件的時間作為上下文名稱:
4、設置loger、root
設置loger:用來設置某一個包或者具體的某一個類的日志打印級別、以及指定<appender>。<logger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
name:用來指定受此loger約束的某一個包或者具體的某一個類。
level:用來設置打印級別(日志級別),大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那么當前loger將會繼承上級的級別。
addtivity:是否向上級loger傳遞打印信息。默認是true。
可以包含零個或多個元素,標識這個appender將會添加到這個loger。
設置root:也是<logger>元素,但是它是根logger。只有一個level屬性,應為已經被命名為"root".
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。
<root>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
5、舉例說明
TestController.java測試類:
package com.example.logback;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class TestController {/*** 獲取一個日志組件*/Logger logger = LoggerFactory.getLogger(getClass());@GetMapping("/helloLogback")public String testDemo() {logger.trace("hello trace");logger.debug("hello debug");logger.info("hello info");logger.warn("hello warn");logger.error("hello error");return "Hello Logback!";} }5.1、只配置root
logback-spring.xml配置內容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoder 默認配置為PatternLayoutEncoder --><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="STDOUT"/></root> </configuration>其中appender的配置表示打印到控制臺,<root level=“INFO”>將root的打印級別設置為“INFO”,指定了名字為“STDOUT”的appender。
當執行/helloLogback方法時,root將級別為“INFO”及大于“INFO”的日志信息交給已經配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺;打印測試結果:
08:48:57.007 [http-nio-8080-exec-2] INFO o.a.c.c.C.[.[.[/logback-demo] - Initializing Spring DispatcherServlet 'dispatcherServlet' 08:48:57.007 [http-nio-8080-exec-2] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' 08:48:57.014 [http-nio-8080-exec-2] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 7 ms 08:49:11.080 [http-nio-8080-exec-3] INFO com.example.logback.TestController - hello info 08:49:11.080 [http-nio-8080-exec-3] WARN com.example.logback.TestController - hello warn 08:49:11.080 [http-nio-8080-exec-3] ERROR com.example.logback.TestController - hello error5.2、帶有logger的配置,不指定界別,不指定appender
logback-spring.xml配置如下所示:
<?xml version="1.0" encoding="UTF-8"?> <configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoder 默認配置為PatternLayoutEncoder --><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 這個是測試類TestController所在的包名 --><logger name="com.example.logback"/><!-- 注意這里將級別調整為DEGUGE級別 --><root level="DEBUGE"><appender-ref ref="STDOUT"/></root> </configuration>當執行/helloLogback方法時,因為其在com.example.logback包中,所以首先執行<logger name=“com.example.logback”/>,將級別為“DEBUG”及大于“DEBUG”的日志信息傳遞給root,本身并不打印;
root接到下級傳遞的信息,交給已經配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺;打印結果如下所示:
5.3、帶有多個logger的配置,指定級別,指定appender
logback-spring.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoder 默認配置為PatternLayoutEncoder --><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 將spring框架的日志界別調整為ERROR級別,ERROR級別以下的不打印--><logger name="org.springframework" level="ERROR"/><!-- 這個是測試類TestController所在類名,指定WRAN以上級別日志輸出,并且不向上傳遞,以免重復打印 --><logger name="com.example.logback.TestController" level="WARN" additivity="false"><appender-ref ref="STDOUT"/></logger><!-- 這個是測試類Test2Controller所在類名,內容和TestController一模一樣 --><logger name="com.example.logback.Test2Controller"/><!-- 注意這里將級別調整為DEGUGE級別 --><root level="DEBUGE"><appender-ref ref="STDOUT"/></root> </configuration>對于 <logger name=“com.example.logback.Test2Controller”/>解釋:
對于<logger name=“com.example.logback.TestController” level=“WARN” additivity=“false”>解釋:
最后,<root level=“DEBUG”>將root的打印級別設置為“DEBUG”,指定了名字為“STDOUT”的appender。
總結日志打印信息:
當執行com.example.logback.TestController里面的方法時,先執行<logger name=“com.example.logback.TestController” level=“WARN” additivity=“false”>,將級別為“WARN”及大于“WARN”的日志信息交給此logger指定的名為“STDOUT”的appender處理,在控制臺中打出日志,不再向次logger的上級 傳遞打印信息;
訪問http://localhost:8080/logback-demo/helloLogback,日志打印結果:
09:38:30.571 [http-nio-8080-exec-1] INFO o.a.c.c.C.[.[.[/logback-demo] - Initializing Spring DispatcherServlet 'dispatcherServlet' 09:38:30.600 [http-nio-8080-exec-1] WARN com.example.logback.TestController - hello warn 09:38:30.600 [http-nio-8080-exec-1] ERROR com.example.logback.TestController - hello error訪問http://localhost:8080/logback-demo/helloLogback2,日志打印結果:
09:39:58.732 [http-nio-8080-exec-2] DEBUG com.example.logback.Test2Controller - hello debug 09:39:58.732 [http-nio-8080-exec-2] INFO com.example.logback.Test2Controller - hello info 09:39:58.732 [http-nio-8080-exec-2] WARN com.example.logback.Test2Controller - hello warn 09:39:58.732 [http-nio-8080-exec-2] ERROR com.example.logback.Test2Controller - hello error以上可以看出logback控制日志的粒度是非常細的。
如果將沒有設置addtivity值修改為true,會發生什么?這個是控制日志輸出的位置的,推測會向自己的logger打印一份,同時向上一級root傳遞一份,也就是打印兩次日志,驗證一下:
<!-- 這個是測試類TestController所在類名,指定WRAN以上級別日志輸出,并且不向上傳遞,以免重復打印 --><logger name="com.example.logback.TestController" level="WARN" additivity="true"><appender-ref ref="STDOUT"/></logger>訪問http://localhost:8080/logback-demo/helloLogback,日志打印結果:
09:43:38.805 [http-nio-8080-exec-1] INFO o.a.c.c.C.[.[.[/logback-demo] - Initializing Spring DispatcherServlet 'dispatcherServlet' 09:43:38.836 [http-nio-8080-exec-1] WARN com.example.logback.TestController - hello warn 09:43:38.836 [http-nio-8080-exec-1] WARN com.example.logback.TestController - hello warn 09:43:38.836 [http-nio-8080-exec-1] ERROR com.example.logback.TestController - hello error 09:43:38.836 [http-nio-8080-exec-1] ERROR com.example.logback.TestController - hello error參考其他:
logback 配置詳解(二)——appender(https://www.cnblogs.com/cb0327/p/5770794.html)
Springboot集成logback,控制臺日志打印兩次,并且是不同的線程打印的(http://shangdixinxi.com/detail-1501889.html)
總結
以上是生活随笔為你收集整理的SpringBoot笔记:SpringBoot2.3集成Logback日志组件配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7下安装Redis伪集群(基
- 下一篇: SpringBoot笔记:SpringB