SpringBoot從入門到放棄,第二章

SpringBoot從入門到放棄,第二章

一、Profile多環境支持

1、多Profile文件

我們在主配置文件編寫的時候文件名可以是:application-{profile}.properties/yml

默認使用application.properties

2、yml支持多文檔塊方式

server:
  port: 8080
spring:
  profiles:
    active: dev ##激活dev配置塊
    
---
server:
  port: 8081
spring:
  profiles: dev
  
---
server:
  port: 8082
spring:
  profiles: prod

3、激活指定的profile

1、在配置文件中指定 spring.profiles.active=dev
2、在JVM參數中激活 -Dspring.profiles.active=dev
3、命令行  java -jar boot-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

二、配置文件加載位置

springboot啓動會掃描一下位置的application.properties或者application.yml文件作爲springboot的默認配置文件

-file:./config/
-file:./
-classpath:/config/
-classpath:/

以上是按照優先級從高到低的順序,所有位置的文件都會被加載,高優先級配置內容會覆蓋低優先級配置內容。

我們也可以通過配置spring.config.location來改變默認配置

三、SpringBoot與日誌

常見的日誌框架:JUL JCL Jboss-loggin logback log4j log4j2 slf4j

接口抽象層 實現
JCL SLF4J JBOSS-LOGGING log4j JUL(java.util.logging) log4j2 logback

springboot選用SLF4J和logback

1、SLF4J使用

日誌記錄方法的調用,不應該直接調用日誌的實現類,而是調用日誌抽象層裏面的方法

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、遺留問題

a(slf4j+logback): Spring (commons-logging)、Hibernate(jboss-logging)、Mybatis、XXX

統一日誌記錄,即是是別的框架也一起使用SLF4J進行輸出

在這裏插入圖片描述

(1)將系統中其他日誌框架先排除出去

(2)用中間包來替換原有的日誌框架

(3)再來導入slf4j其他的實現,如logback

3、SpringBoot日誌關係

springboot開發需要添加如下日誌依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <version>2.2.1.RELEASE</version>
    <scope>compile</scope>
</dependency>

但是呢,實際開發中我們不需要直接添加該依賴。

你會發現 spring-boot-starter 其中包含了 spring-boot-starter-logging ,該依賴內容就是 Spring Boot 默認的日誌框架 logback 。

在這裏插入圖片描述

總結:

1》springboot底層也是使用了slf4j+logback的方式進行日誌記錄
2》springboot也把其他的日誌都替換成了SLF4J
3》springboot也增加了中間替換包
4》如果我們要引入其他框架,一定要把這個框架的默認日誌依賴移除掉
	例如 Spring (默認使用commons-logging)
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <exclusions>
    	<exclusion>
        	<groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4、日誌使用

SpringBoot的默認配置寫在,org.springframework.boot:spring-boot:2.2.1.RELEASE文件下的logging包中,如base.xml defaults.xml console-appender.xml 和 file-appender.xml等

springboot默認已經配置好了日誌

private Logger logger = LoggerFactory.getLogger(SpringBootTest.class);

@Test
public void testLog(){

    logger.trace("this is trace log..");
    logger.debug("this is debug log..");
    logger.info("this is info log..");
    logger.warn("this is warn log..");
    logger.error("this is error log..");

}

日誌級別由低到高

trace<debug<info<warn<error<fatal

如果設置爲 WARN ,則低於 WARN 的信息都不會輸出。

可以調整輸入日誌的級別,springboot默認使用info級別的日誌

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 生效

默認情況下,日誌文件的大小達到 10MB 時會切分一次,產生新的日誌文件

因爲在 springboot默認配置文件file-appender中有如下配置:

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>${ROLLING_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
    <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
</rollingPolicy>

更改日誌級別

logging:
  # 分割文件設置 超過 10MB就進行分割,最大保留歷史 90天
  maxFileSize: 10MB
  maxHistory: 90
  level:
  	root: INFO ##這裏是用的root級別,即項目的所有日誌,我們也可以使用package級別,即指定包下使用相應的日誌級別
  path: log ##該屬性用來配置日誌文件的路徑
  file: springboot.log ##該屬性用來配置日誌文件名,如果該屬性不配置,默認文件名爲spring.log
  pattern:
  	console: ##控制檯輸入的日誌格式
  	file: ##文件中日誌輸出格式
  	
##logging.level.com.lee.boot.dao=WARN  將指定包下的日誌級別設置爲WARN
  	

日誌輸出格式:

%d表示日期時間
%thread表示線程名
%-5level級別從左顯示5個字符寬度
%logger{50}表示logger名字最長50個字符,否則按照句點分隔
%msg:日誌消息
%n是換行符

eg:
	%d{yyyy-MM-dd HH:mm:ss.SSS} {%thread} %-5level %logger{50} -%msg%n

定義自己的log配置文件

默認配置文件名稱:

( 默認的命名規則,並且放在 src/main/resources 下面即可;spring就不使用它默認的配置了)

logging system customization
logback logback-spring.xml OR logback.xml等
log4j2 log4j2-spring.xml OR log4j2.xml
java util logging logging.properties

如果你即想完全掌控日誌配置,但又不想用 logback.xml 作爲 Logback 配置的名字, application.yml 可以通過 logging.config 屬性指定自定義的名字:

logging.config=classpath:logging-config.xml

logback-spring.xml是被springboot識別的

logback.xml是被logback日誌框架識別的

所以推薦使用logback-spring.xml

logback-spring.xml可以使用springboot的根據test dev prod等環境來配置日誌標籤

同spring.profiles.active=dev等一同使用(激活環境)

<springProfile name="dev,staging">
    .....
</springProfile>
<springProfile name="!dev">
    .....
</springProfile>

5、logback配置文件組成

根節點

根節點包含的屬性:

scan:當此屬性設置爲 true 時,配置文件如果發生改變,將會被重新加載,默認值爲 true 。

scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。
當 scan 爲 true 時,此屬性生效。默認的時間間隔爲1分鐘。

debug:當此屬性設置爲 true 時,將打印出 logback 內部日誌信息,實時查看 logback 
運行狀態。默認值爲 false 。

根下面有5個子節點。

5.1)、節點:

root 節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個 level 屬性,用於設置打印級別,大小寫無關 ,可選如下:TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF。 默認是DEBUG。

可以包含零個或多個元素,標識這個appender將會添加到這個loger。

<root level="debug">
 <appender-ref ref="console" />
 <appender-ref ref="file" />
</root>

5.2)、設置上下文名稱

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

<contextName>logback</contextName>

5.3)、 設置變量

用來定義變量值的標籤, 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量後,可以使“${}”來使用變量。

<property name="logback.logdir" value="/Users/inke/dev/log/tomcat"/>
<property name="logback.appname" value="app"/>

5.4)、

appender用來格式化日誌輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略和文件輸出策略。

控制檯輸出 ConsoleAppender :

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    
    <contextName>logback-demo</contextName>
    
    <!--輸出到控制檯 ConsoleAppender-->
    <appender name="consoleLog1" class="ch.qos.logback.core.ConsoleAppender">
        <!--展示格式 layout-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d -1 %msg%n</pattern>
        </layout>
    </appender>
    
    <!--輸出到控制檯 ConsoleAppender-->
    <appender name="consoleLog2" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d -2 %msg%n</pattern>
        </encoder>
    </appender>
    
    <!--指定最基礎的日誌輸出級別-->
    <root level="INFO">
        <!--appender將會添加到這個loger-->
        <appender-ref ref="consoleLog1"/>
        <appender-ref ref="consoleLog2"/>
    </root>
</configuration>

可以看到 layout 和 encoder ,都可以將事件轉換爲格式化後的日誌記錄,但是控制檯輸出使用 layout ,文件輸出使用 encoder 。

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    
    <contextName>logback-demo</contextName>
    
    <!--輸出到控制檯 ConsoleAppender-->
    <appender name="consoleLog1" class="ch.qos.logback.core.ConsoleAppender">
        <!--展示格式 layout-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            </pattern>
        </layout>
        <!--
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>ERROR</level>
     </filter>
      -->
    </appender>
    
    <!--指定最基礎的日誌輸出級別-->
    <root level="INFO">
        <!--appender將會添加到這個loger-->
        <appender-ref ref="consoleLog1"/>
        <appender-ref ref="consoleLog2"/>
    </root>
    
</configuration>

表示對日誌進行編碼:

%d{HH: mm:ss.SSS}——日誌輸出時間
%thread——輸出日誌的進程名字,這在Web應用以及異步任務處理中很有用
%-5level——日誌級別,並且使用5個字符靠左對齊
%logger{36}——日誌輸出者的名字
%msg——日誌消息
%n——平臺的換行符

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

<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
    <!--如果只是想要 Info 級別的日誌,只是過濾 info 還是會輸出 Error 日誌,因爲 Error 的級別高,
     所以我們使用下面的策略,可以避免輸出 Error 的日誌-->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <!--過濾 Error-->
        <level>ERROR</level>
        <!--匹配到就禁止-->
        <onMatch>DENY</onMatch>
        <!--沒有匹配到就允許-->
        <onMismatch>ACCEPT</onMismatch>
    </filter>
    
    
    <!--日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的文件路徑規則
     如果同時有<File>和<FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天
     的日誌改名爲今天的日期。即,<File> 的日誌都是當天的。
     -->
    <File>${logback.logdir}/info.${logback.appname}.log</File>
    
    
    <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--文件路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個文件中,以防止日誌填滿整個磁盤空間-->
        <FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
        <!--只保留最近90天的日誌-->
        <maxHistory>90</maxHistory>
        <!--用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌-->
        <!--<totalSizeCap>1GB</totalSizeCap>-->
    </rollingPolicy>
    
    
    <!--日誌輸出編碼格式化-->
    <encoder>
        <charset>UTF-8</charset>
        <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
    </encoder>
    
</appender>


<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
    <!--如果只是想要 Error 級別的日誌,那麼需要過濾一下,默認是 info 級別的,ThresholdFilter-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>Error</level>
    </filter>
    
    <!--日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的文件路徑規則
     如果同時有<File>和<FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天
     的日誌改名爲今天的日期。即,<File> 的日誌都是當天的。
     -->
    
    <File>${logback.logdir}/error.${logback.appname}.log</File>
    
    <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--文件路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個文件中,以防止日誌填滿整個磁盤空間-->
        <FileNamePattern>${logback.logdir}/error.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
        <!--只保留最近90天的日誌-->
        <maxHistory>90</maxHistory>
        <!--用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌-->
        <!--<totalSizeCap>1GB</totalSizeCap>-->
    </rollingPolicy>
    
    <!--日誌輸出編碼格式化-->
    <encoder>
        <charset>UTF-8</charset>
        <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
    </encoder>
    
</appender>

如果同時有 和 ,根據日期分割日誌。

如果要區分 Info 和 Error 級別的日誌,那麼需要使用過濾規則的策略。

5.5)、

用來設置某一個包或者具體的某一個類的日誌打印級別、以及指定 。 僅有一個 name 屬性,一個可選的 level 和一個可選的 addtivity 屬性。

name :用來指定受此loger約束的某一個包或者具體的某一個類。

level :用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那麼當前loger將會繼承上級的級別。

addtivity :是否向上級loger傳遞打印信息。默認是true。

loger在實際使用的時候有兩種情況

第一種:帶有 loger 的配置,不指定級別,不指定 appender

logback-spring.xml 增加 loger 配置如下:

<logger name="com.dudu.controller"/>
<logger name="com.dudu.controller" /> 
將控制 controller 包下的所有類的日誌的打印,但是並沒用設置打印級別,
所以繼承他的上級的日誌級別 “info” 

沒有設置 addtivity ,默認爲true,將此 loger 的打印信息向上級傳遞;

沒有設置 appender ,此 loger 本身不打印任何信息。

將 root 的打印級別設置爲 “info” ,指定了名字爲 “console” 的 appender 。

當執行 com.dudu.controller.LearnController 類的 login 方法時, LearnController 在包com.dudu.controller中,所以首先執行 `` ,將級別爲 “info” 及大於 “info” 的日誌信息傳遞給 root ,本身並不打印;

root 接到下級傳遞的信息,交給已經配置好的名爲“console”的 appender 處理, “console” appender 將信息打印到控制檯;

第二種:帶有多個 loger 的配置,指定級別,指定 appender

ogback-spring.xml 增加 loger 配置如下:

<configuration>
    <!--logback.LogbackDemo:類的全路徑 -->
    <logger name="com.lee.controller.LearnController" level="WARN" additivity="false">
        <appender-ref ref="console"/>
    </logger>
</configuration>

控制 com.lee.controller.LearnController 類的日誌打印,打印級別爲“ WARN ”;

additivity 屬性爲 false ,表示此 loger 的打印信息不再向上級傳遞;

6、項目中用到的日誌文件配置

第一個

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="60 seconds">

	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern>
		</encoder>
	</appender>
	
	<appender name="springboot"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- <Encoding>UTF-8</Encoding> -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<FileNamePattern>logs/logback/springboot_%d{yyyy-M-d}.log
			</FileNamePattern>
			<MaxHistory>10</MaxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern>
		</encoder>
	</appender>
	
	<appender name="redpigmall"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<FileNamePattern>logs/logback/redpigmall_%d{yyyy-M-d}.log
			</FileNamePattern>
			<MaxHistory>10</MaxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern>
		</encoder>
	</appender>

	<logger name="org.springframework.boot" level="debug"
		additivity="false">
		<appender-ref ref="springboot" />
	</logger>
	
	<!-- name包必須能夠掃描到所以類,包括啓動類 -->
	<logger name="com.redpigmall" level="debug" additivity="false">
		<appender-ref ref="redpigmall" />
	</logger>
	
	<root level="debug">
		<appender-ref ref="stdout" />
	</root>
	
</configuration>  

第二個

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!--滾動記錄文件-->
    <appender name="eas" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>/Users/air/Desktop/project/project_my/logs/eas_log/eas.log</File>
        <!--滾動策略:按天生成日誌,並自動壓縮-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/Users/air/Desktop/project/project_my/logs/eas_log/eas.log.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <append>true</append>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--滾動記錄文件-->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>/Users/air/Desktop/project/project_my/logs/eas_log/error.log</File>
        <!--滾動策略:按天生成日誌,並自動壓縮-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/Users/air/Desktop/project/project_my/logs/eas_log/error.log.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <append>true</append>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--將日誌輸出到控制檯,要具體控制哪些類要輸出日誌則用logger標籤控制-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoding>UTF-8</encoding>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="console"/>
        <appender-ref ref="error"/>
    </root>

    <!--打印cn.xqd.eas包下的內容,日誌級別爲INFO-->
    <logger name="cn.xqd.eas" additivity="false" level="INFO" >
        <appender-ref ref="eas" />
        <appender-ref ref="console"/>
    </logger>

    <!--打印cn.xqd.eas.mapper包下的內容,即Mybatis相關日誌信息,日誌級別爲DEBUG-->
    <logger name="cn.xqd.eas.dao" level="DEBUG"/>
</configuration>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章