開發中Boot日誌配置

1.SpringBoot日誌關係:

SpringBoot使用它來做日誌功能:

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

底層依賴關係
在這裏插入圖片描述
但是呢,實際開發中我們不需要直接添加該依賴。
因爲spring-boot-starter 其中包含了 spring-boot-starter-logging ,該依賴內容就是 Spring Boot 默認的日誌框架 logback 。

SpringBoot能自動適配所有的日誌,而且底層使用slf4j+logback的方式記錄日誌,引入其他框架的時候,只需要 把這個框架依賴的日誌框架排除掉即可:

<dependency> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring‐boot‐starter‐web</artifactId>
	<exclusions> 
		<exclusion> 
			<artifactId>spring‐boot‐starter‐logging</artifactId> 
			<groupId>org.springframework.boot</groupId> 
		</exclusion>
	</exclusions> 
</dependency>

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

2.SpringBoot日誌的使用

2.1 默認配置使用

SpringBoot默認幫我們配置好了日誌
日誌輸出格式:

 %d表示日期時間,
 %thread表示線程名,
 %‐5level:級別從左顯示5個字符寬度
 %logger{50} 表示logger名字最長50個字符,否則按照句點分割。 
 %msg:日誌消息, 
 %n是換行符 
 %d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n

1)控制檯輸出:
日誌級別從高到低分爲:TRACE < DEBUG < INFO < WARN < ERROR
如果設置爲 INFO ,則低於 INFO 的信息都不會輸出。
Spring Boot 中默認配置 ERRORWARNINFO級別的日誌輸出到控制檯。

//記錄器 
Logger logger = LoggerFactory.getLogger(getClass());

@Test 
public void contextLoads() {
	//可以調整輸出的日誌級別;日誌就只會在這個級別以以後的高級別生效
	logger.trace("這是trace日誌..."); 
	logger.debug("這是debug日誌..."); 
	//SpringBoot默認給我們使用的是info級別的,
	logger.info("這是info日誌..."); 
	logger.warn("這是warn日誌..."); 
	logger.error("這是error日誌...");
}

如果每次都寫這行代碼LoggerFactory.getLogger(getClass());會很麻煩,可以使用註解,但是需要使用 lombok
① 添加依賴:

<dependency>
	<groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <!--可以直接用boot自帶版本-->
    <version>1.8.12</version>
    <optional>true</optional>
</dependency>

② 允許註解處理:Settings -> Compiler -> Annotation Processors
在這裏插入圖片描述
③ 使用:
在這裏插入圖片描述
2)文件輸出:
默認情況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌文件
使用 Spring Boot 可以在 application.properties 或 .yml 配置簡單的使用

# 在控制檯輸出的日誌的格式
logging.pattern.console=%d{yyyy‐MM‐dd} [%thread] %‐5level %logger{50} ‐ %msg%n
# 指定文件中日誌輸出的格式
logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n
logging.file  設置文件,可以是絕對路徑,也可以是相對路徑。如: logging.file=my.log
logging.path  設置目錄,會在該目錄下創建 spring.log 文件,並寫入日誌內容。 如:logging.path=/var/log
如果只配置 logging.file ,會在項目的當前路徑下生成一個 xxx.log 日誌文件。
如果只配置 logging.path ,在 /var/log 文件夾生成一個日誌文件爲 spring.log

在這裏插入圖片描述注:二者不能同時使用,如若同時使用,則只有 logging.file生效

3)級別控制:
在application.properties中進行配置:
格式爲: logging.level.* = LEVEL
logging.level: 日誌級別控制前綴
*: 包名或者Logger名
LEVEL :選項 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

2.2自定義配置

因爲SpringBoot默認日誌配置只能滿足簡單的場景,像區分日誌級別文件、每天一個日誌文件等複雜需求就無法滿足,所以可以使用日誌框架自己的配置文件。

Logging System Customization
Logback logback-spring.xml , logback-spring.groovy , logback.xml or logback.groovy
Log4j log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2 log4j2-spring.xml , log4j2.xml
JDK (Java Util Logging) logging.properties

如果你想針對不同運行時 Profile 使用不同的日誌配置,自己配置LogBack日誌文件的名字,則可以在boot配置文件中進行指定:
logging.config=classpath\:logback-dev.xml

一般不需要這個屬性,而是直接在 logback-spring.xml中使用 springProfile 配置,不需要 logging.config指定不同環境使用不同配置文件。 springProfile 配置在下面介紹。

日誌配置文件詳解

根節點<configuration>
包含的屬性:

  • scan:當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
  • scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
  • debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。

根節點下面包含了5個子節點:

② 字節點<contextName> 設置上下文名稱

每個logger都關聯到logger上下文,默認上下文名稱爲“default”。但可以使用設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改,可以通過 %contextName來打印日誌上下文名稱,一般不用這個屬性,可有可無。

<contextName>logback</contextName>

③ 字節點<property> 設置變量
用來定義變量值的標籤, 有兩個屬性,name和value;通過定義的值會被插入到logger上下文中。定義變量後,可以使${}來使用變量。

<!-- 定義日誌的根目錄 -->
<property name="LOG_HOME" value="app/log" />
<!-- 定義日誌文件名稱 -->
<property name="appName" value="mhh"></property>

④ 字節點<appender>
appender用來格式化日誌輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略和文件輸出策略。
控制檯輸出ConsoleAppender
示例一:使用layout

 <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </layout>
 </appender>

在這裏插入圖片描述
示例二:使用encoder

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
        	<charset>UTF-8</charset>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
 </appender>

encoder 和 layout 在作用上沒有本質區別。但是自0.9.19版本之後,極力推薦使用encoder。

輸出到文件FileAppenderRollingFileAppender
用法都一樣,這裏不詳細展開,詳細可看appender數據源

隨着應用的運行時間越來越長,日誌也會增長的越來越多,將他們輸出到同一個文件並非一個好辦法。 RollingFileAppender 用於切分文件日誌:

 <!-- 滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其他文件 -->  
    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
     	
        <!--日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的文件路徑規則如果同時有<File>和<FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天的日誌改名爲今天的日期<File> 的日誌都是當天的。-->
        <file>${LOG_HOME}/${appName}.log</file>
        
        <!--如果只是想要 Info 級別的日誌,只是過濾 info 還是會輸出 Error 日誌,因爲 Error 的級別高,所以我們使用下面的策略,可以避免輸出 Error 的日誌-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        	<!--過濾 Error-->
            <level>Error</level>
        </filter>
        
        <!--當發生滾動時,決定 RollingFileAppender 的行爲,涉及文件移動重命名TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。  -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        
            <!--文件路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個文件中,以防止日誌填滿整個磁盤空間-->
            <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            
            <!-- 可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每天滾動,且maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。注意,刪除舊文件是,那些爲了歸檔而創建的目錄也會被刪除。 -->
            <MaxHistory>365</MaxHistory>
            
            <!--用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            
        </rollingPolicy>
        <!-- 日誌輸出格式: -->     
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </layout>
    </appender>

在這裏插入圖片描述

⑤ 子節點<root>
root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性。
默認是DEBUG。
可以包含零個或多個元素,標識這個appender將會添加到這個loger。

<root level="debug">
        <appender-ref ref="stdout" />
        <appender-ref ref="appLogAppender" />
</root>

⑥ 子節點:<logger>
<loger> 用來設置某一個包或者具體的某一個類的日誌打印級別、以及指定 <appender>
常用屬性:
name:用來指定受此loger約束的某一個包或者具體的某一個類。
level:要記錄的日誌級別,包括 TRACE < DEBUG < INFO < WARN < ERROR
additivity:作用在於children-logger是否使用 rootLogger配置的appender進行輸出。即是否向上級loger傳遞打印信息。默認是true。
false:表示只用當前logger的appender-ref,
true:表示當前logger的appender-ref和rootLogger的appender-ref都有效

多環境日誌輸出

<configuration>
 ...
 <!-- 測試環境+開發環境. 多個使用逗號隔開. -->
		 <springProfile name="test,dev">
		 		<logger name="com.example.demo.controller" level="DEBUG" additivity="false">
		  				<appender-ref ref="consoleLog"/>
			 </logger>
		 </springProfile>
		 <!-- 生產環境. -->
		 <springProfile name="prod">
		 		<logger name="com.example.demo.controller" level="INFO" additivity="false">
		  				<appender-ref ref="consoleLog"/>
				 </logger>
		</springProfile>
</configuration>

這裏給上一個真實項目的日誌配置文件,以便於對應理解 下載地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章