一、多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
springboot啓動會掃描一下位置的application.properties或者application.yml文件做爲springboot的默認配置文件框架
-file:./config/ -file:./ -classpath:/config/ -classpath:/
以上是按照優先級從高到低的順序,全部位置的文件都會被加載,高優先級配置內容會覆蓋低優先級配置內容。異步
咱們也能夠經過配置spring.config.location來改變默認配置spring-boot
常見的日誌框架:JUL JCL Jboss-loggin logback log4j log4j2 slf4jthis
接口抽象層 | 實現 |
---|---|
log4j |
springboot選用SLF4J和logback編碼
日誌記錄方法的調用,不該該直接調用日誌的實現類,而是調用日誌抽象層裏面的方法
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開發須要添加以下日誌依賴
<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>
根節點<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>