第四篇 : SpringBoot 日誌
日誌框架
市面上的日誌框架:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j ...
日誌門面 | 日誌實現 |
---|---|
JUL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |
劃線的是我們開發中不常用的,所以我們首選的日誌框架是SLF4j,log4j性能問題,所以其作者開發了新的 logback;log4j2是apache開的的日誌框架,性能很好,但是現在市面上用它的還比較少,我們若使用可能會出現兼容問題,所以我們開發中一般的選擇是:
日誌門面:SLF4j
日誌實現:logback
SpringBoot:底層是Spring框架,Spring框架默認是用JCL;SpringBoot對其進行了包裝,Srping Boot選用 SLF4j和logback。
SLF4j
1、如何在系統中使用SLF4j
以後我們開發的時候,日誌記錄方法的調用,不應該直接掉用日誌的實現類,而是調用日誌抽象層裏的方法。首先要給系統導入slf4j的jar 和 logback的實現jar
import org.slf4j.Logger;
import org.slf4j.LoggerFactory
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("hello World"); }
}
2、日誌框架適配SLF4j的圖解
每個日誌的實現框架都有自己的配置文件,使用slf4j以後,配置文件還是用日誌實現框架自己本身的配置文件
3、統一日誌框架
1.問題
實際開發中項目可能是整合了很多框架例如 Spring(commons-logging)、Hibernate(jboss-logging)等等
我們怎麼統一使用slf4j進行輸出 ?
2.統一日誌框架圖解
讓系統中所有的日誌都統一到slf4j:
1、將系統中的其他日誌框架先排除出去
2、用中間包來替換原有的日誌框架
3、我們導入slf4j其他的實現
4、SpringBoot日誌關係
1.pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2.底層依賴關係圖
3.總結
SpringBoot底層也是使用slf4j+logback的方式進行日誌記錄
SpringBoot把其他的日誌替換成了slf4j
日誌的使用
1、默認配置
SpringBoot默認幫我配置好了日誌.
package com.gf;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootLoggingApplicationTests {
//日誌記錄器
Logger logger = LoggerFactory.getLogger( this.getClass() );
@Test
public void contextLoads() {
//日誌級別(由高到底):trace < debug < info < warn < error
//可以調整輸出的日誌級別,日誌只會在這個級別以後的高級別生效
logger.trace( "這是trace日誌..." );
logger.warn( "這是warn日誌..." );
logger.debug( "這是error日誌..." );
//SpringBoot默認給我們使用的是info級別,沒有指定級別就使用SpringBoot默認的規定
logger.info( "這是error日誌..." );
logger.warn( "這是error日誌..." );
logger.error( "這是error日誌..." );
}
}
日誌輸出格式:
%d表示日期時間,
%thread表示線程名,
%‐5level:級別從左顯示5個字符寬度
%logger{50} 表示logger名字最長50個字符,否則按照句點分割。 %msg:日誌消息,
%n是換行符
‐‐>
%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
2、修改SpringBoot日誌的默認配置
logging.level.com.gf=trace
#logging.path 和 logging.path 是衝突設置 ,兩者都設置時只有 logging.path 起作用
#指定文件名,就在項目下生產springboot.log日誌
#logging.file=springboot.log
# 在當前磁盤路徑下創建spring文件夾和裏面的log文件夾;使用spring.log 作爲默認文件
logging.path=/Users/huanchu/Documents/spring/log
# 指定控制檯輸出的日誌格式
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
3、logback.xml指定配置
<?xml version="1.0" encoding="UTF-8"?><!--
scan:當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
-->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<!-- 定義日誌的根目錄 -->
<property name="LOG_HOME" value="log" />
<!-- 定義日誌文件名稱 -->
<property name="appName" value="springboot-logging"></property>
<!-- ch.qos.logback.core.ConsoleAppender 表示控制檯輸出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--
日誌輸出格式:
%d表示日期時間,
%thread表示線程名,
%-5level:級別從左顯示5個字符寬度
%logger{50} 表示logger名字最長50個字符,否則按照句點分割。
%msg:日誌消息,
%n是換行符
-->
<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>
<!-- 滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其他文件 -->
<appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定日誌文件的名稱 -->
<file>${LOG_HOME}/${appName}.log</file>
<!--
當發生滾動時,決定 RollingFileAppender 的行爲,涉及文件移動和重命名
TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--
滾動時產生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日誌滾動
%i:當文件大小超過maxFileSize時,按照i進行文件滾動
-->
<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!--
可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每天滾動,
且maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。注意,刪除舊文件是,
那些爲了歸檔而創建的目錄也會被刪除。
-->
<MaxHistory>365</MaxHistory>
<!--
當日志文件超過maxFileSize指定的大小是,根據上面提到的%i進行日誌文件滾動 注意此處配置SizeBasedTriggeringPolicy是無法實現按文件大小進行滾動的,必須配置timeBasedFileNamingAndTriggeringPolicy
-->
<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>
<!--
logger主要用於存放日誌對象,也可以定義日誌類型、級別
name:表示匹配的logger類型前綴,也就是包的前半部分
level:要記錄的日誌級別,包括 TRACE < DEBUG < INFO < WARN < ERROR
additivity:作用在於children-logger是否使用 rootLogger配置的appender進行輸出,
false:表示只用當前logger的appender-ref,true:
表示當前logger的appender-ref和rootLogger的appender-ref都有效
-->
<!--hibernate logger-->
<logger name="com.gf" level="debug" />
<!-- Spring framework logger -->
<!--<logger name="org.springframework" level="debug" additivity="false"></logger>-->
<!--
root與logger是父子關係,沒有特別定義則默認爲root,任何一個類只會和一個logger對應,
要麼是定義的logger,要麼是root,判斷的關鍵在於找到這個logger,然後判斷這個logger的appender和level。
-->
<root level="info">
<appender-ref ref="stdout" />
<appender-ref ref="appLogAppender" />
</root>
</configuration>
配置文件命名爲logback.xml時,直接被日誌框架識別。如果我們把文件名更改成logback-spring.xml,這樣就不會被日誌框架直接識別,這樣配置文件就由SpringBoot加載,就可以使用SpringBoot的一些高級功能:
<!-- 可以指定某段配置只在某個環境下生效 -->
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
例如:
<!-- 設置不同環境下日誌的打印格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ----> %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<springProfile name="test">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ===== [%thread] ===== %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<springProfile name="test">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</springProfile>
</layout>
本文分享自微信公衆號 - 程序員果果(huanchuguofupk_gz)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。