最实用的logback讲解(1)
文章目錄
- 1. pom依賴和logback.xml
- 2. configuration屬性介紹
- 3. logger和root屬性的使用
- 3.1 addtivity屬性重點講解
- 4. appender
logback,一個“可靠、通用、快速而又靈活的Java日志框架”,是springboot默認的日志框架。
1. pom依賴和logback.xml
注意spring-boot-starter-parent里已集成logback,可直接使用。
在工程resources目錄下建立logback.xml
1.logback首先會試著查找logback.groovy文件;
2.當沒有找到時,繼續試著查找logback-test.xml文件;
3.當沒有找到時,繼續試著查找logback.xml文件;
4.如果仍然沒有找到,則使用默認配置(打印到控制臺)。
2. configuration屬性介紹
<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="false" packagingData="true"><!-- 用來設置上下文名稱,每個logger都關聯到logger上下文,默認上下文名稱為default。但可以使用<contextName>設置成其他名字,用于區分不同應用程序的記錄。一旦設置,不能修改。--><contextName>myApplicationName</contextName><!--用來定義變量值,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使用“${}”來使用變量。name: 變量的名稱,value: 的值時變量定義的值--><property name="LOG_HOME" value="${catalina.base}/logs/cloudTest/" /><!--獲取時間戳字符串,他有兩個屬性key和datePattern key: 標識此<timestamp> 的名字;datePattern: 設置將當前時間(解析配置文件的時間)轉換為字符串的模式,遵循 java.txt.SimpleDateFormat的格式。這個屬性很少使用 --><timestamp key="keyValue" datePattern="yyyy-MM-dd" /> <contextName>${keyValue}</contextName><!--其他配置略--> </configuration>-
configuration
scan 屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。
scanPeriod: 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
debug: 當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。
packagingData:Logback可以包括它輸出的堆棧跟蹤行的每一行的打包數據。打包數據由JAR文件的名稱和版本組成,堆棧跟蹤行的類就是在JAR文件中創建的。默認為false -
contextName
-
property
可以定義一些變量,常用于定義日志文件輸出位置。 -
timestamp
3. logger和root屬性的使用
logger 是configuration的子節點,用來設置某一個包或者具體的某一個類的日志打印級別、以及指定appender。logger僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
-
name: 用來指定受此logger約束的某一個包或者具體的某一個類。
-
level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特殊值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那么當前logger將會繼承上級的級別。
-
addtivity: 是否向上級logger傳遞打印信息。默認是true。
logger可以包含零個或多個appender-ref元素,標識這個appender將會添加到這個logger。
root也是logger元素,但是它是根logger。只有一個level屬性,因為已經被命名為"root".
-
level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。
-
root可以包含零個或多個appender-ref元素,標識這個appender將會添加到這個logger。
3.1 addtivity屬性重點講解
下面重點說明addtivity的含義,例:
java代碼:
package com.jun.springdemo.controller;、 、 、private final Logger logger = LoggerFactory.getLogger(DemoController.class);@RequestMapping("/get")public String get(){logger.trace("======trace");logger.debug("======debug");logger.info("======info");logger.warn("======warn");logger.error("======error");return "222";}logback.xml配置文件
其中appender的配置表示打印到控制臺;
<root level="INFO">將root的打印級別設置為“INFO”,指定了名字為“STDOUT”的appender。當執行DemoController類的get方法時,root將級別為“INFO”及大于“INFO”的日志信息交給已經配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺;
打印結果如下:
2019-03-07 09:59:17.257 [http-nio-8080-exec-1] INFO [c.h.j.s.c.DemoController:22] - ======info 2019-03-07 09:59:17.257 [http-nio-8080-exec-1] WARN [c.h.j.s.c.DemoController:23] - ======warn 2019-03-07 09:59:17.257 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error<logger name="com.jun.springdemo.controller" />將控制com.jun.springdemo.controller包下的所有類的日志的打印,但是并沒用設置打印級別,所以繼承他的上級的日志級別“DEBUG”;沒有設置addtivity,默認為true,將此logger的打印信息向上級傳遞;沒有設置appender,此logger本身不打印任何信息。
? ? ? ?<root level="DEBUG">將root的打印級別設置為“DEBUG”,指定了名字為“STDOUT”的appender。
當執行com.jun.springdemo.controller.DemoController類的get方法時,因為DemoController在包com.jun.springdemo.controller中,所以首先執行<logger name="com.jun.springdemo.controller" />,將級別為“DEBUG”及大于“DEBUG”的日志信息傳遞給root,本身并不打印;
root接到下級傳遞的信息,交給已經配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺;
打印結果如下:
? ? ? ?<logger name="com.jun.springdemo.controller" />將控制com.jun.springdemo.controller包下的所有類的日志的打印,但是并沒用設置打印級別,所以繼承他的上級的日志級別“error”;沒有設置addtivity,默認為true,將此logger的打印信息向上級傳遞;沒有設置appender,此logger本身不打印任何信息。
? ? ? ? <logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="false">控制com.jun.springdemo.controller.DemoController類的日志打印,打印級別為“INFO”;additivity屬性為false,表示此logger的打印信息不再向上級傳遞,指定了名字為“STDOUT”的appender。
<root level="ERROR">將root的打印級別設置為“ERROR”,指定了名字為“STDOUT”的appender。
? ? ? ?當執行com.jun.springdemo.controller.DemoController類的get方法時,先執行<logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="false">,將級別為“INFO”及大于“INFO”的日志信息交給此logger指定的名為“STDOUT”的appender處理,在控制臺中打出日志,不再向logger的上級 <logger name="com.jun.springdemo.controller"/> 傳遞打印信息; 注意此時因為DemoController位于com.jun.springdemo.controller包下,所以 <logger name="com.jun.springdemo.controller"/>是<logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="false">的上級!
<logger name="com.jun.springdemo.controller"/>未接到任何打印信息,當然也不會給它的上級root傳遞任何打印信息;
打印結果如下:
2019-03-07 10:14:23.472 [http-nio-8080-exec-1] INFO [c.h.j.s.c.DemoController:22] - ======info 2019-03-07 10:14:23.474 [http-nio-8080-exec-1] WARN [c.h.j.s.c.DemoController:23] - ======warn 2019-03-07 10:14:23.475 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error? ? ? ?如果將<logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="false">修改為 <logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="true">那打印結果將是什么呢?
? ? ? ?沒錯,日志打印了兩次,想必大家都知道原因了,因為打印信息向上級傳遞,logger本身打印一次, <logger name="com.jun.springdemo.controller"/>接到后本身因為沒有設置appender不會打印但向上繼續傳遞給root,root會再打印一次。
2019-03-07 11:39:17.131 [http-nio-8080-exec-1] INFO [c.h.j.s.c.DemoController:22] - ======info 2019-03-07 11:39:17.131 [http-nio-8080-exec-1] INFO [c.h.j.s.c.DemoController:22] - ======info 2019-03-07 11:39:17.134 [http-nio-8080-exec-1] WARN [c.h.j.s.c.DemoController:23] - ======warn 2019-03-07 11:39:17.134 [http-nio-8080-exec-1] WARN [c.h.j.s.c.DemoController:23] - ======warn 2019-03-07 11:39:17.134 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error 2019-03-07 11:39:17.134 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error? ? ? ?此處可能令人困惑, <root>日志級別不是error么,怎么還會打印info和warn級別的日志?這里是因為日志信息向上傳遞后,日志級別會由下級的level來決定!所以即使info日志也會打印!! 因此注意一般實際使用中additivity常常設置為false。
4. appender
見最實用的logback講解(2)
總結
以上是生活随笔為你收集整理的最实用的logback讲解(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: netstat命令查看套接字信息
- 下一篇: 最实用的logback讲解(2)—app