SpringBoot從入門到放棄,第二章

SpringBoot從入門到放棄,第二章

1、Profile多環境支持

一、多Profile文件java

咱們在主配置文件編寫的時候文件名能夠是:application-{profile}.properties/ymlspring

默認使用application.propertiestomcat

二、yml支持多文檔塊方式springboot

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

三、激活指定的profileapp

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

2、配置文件加載位置

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

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

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

咱們也能夠經過配置spring.config.location來改變默認配置spring-boot

3、SpringBoot與日誌

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

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

springboot選用SLF4J和logback編碼

一、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");
  }
}

二、遺留問題

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

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

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

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

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

三、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>

四、日誌使用

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>

五、logback配置文件組成

根節點<configuration></configuration>

根節點包含的屬性:

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

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

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

根下面有5個子節點。

5.1)、<root>節點:

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)、<contextName>設置上下文名稱

每一個logger都關聯到logger上下文,默認上下文名稱爲「default」。但可使用設置成其餘名字,用於區分不一樣應用程序的記錄。一旦設置,不能修改,能夠經過 %contextName 來打印日誌上下文名稱,通常來講咱們不用這個屬性,無關緊要。

<contextName>logback</contextName>

5.3)、 <property>設置變量

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

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

5.4)、<appender>

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>

<encoder> 表示對日誌進行編碼:

%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>

若是同時有 <File> 和 <FileNamePattern> ,根據日期分割日誌。

若是要區分 Info 和 Error 級別的日誌,那麼須要使用過濾規則的策略。

5.5)、<loger>

<loger> 用來設置某一個包或者具體的某一個類的日誌打印級別、以及指定 <appender> 。 <loger> 僅有一個 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 的打印信息再也不向上級傳遞;

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

第一個

<?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>
相關文章
相關標籤/搜索