Springboot2(1)日誌配置和動態日誌等級設定
Spring Boot
內部採用的是Commons Logging
進行日誌記錄,但在底層為Java Util Logging、Log4J2、Logback等日誌框架提供了預設配置 。Java 雖然有很多可用的日誌框架,但請不要擔心,一般來說,使用SpringBoot
預設的Logback
就可以了。
注意點
springboot預設的日誌等級是
INFO
要通過
logging.file
或者logging.path
配置springboot日誌的輸出
檔案儲存
預設情況下,SpringBoot
僅將日誌輸出到控制檯,不會寫入到日誌檔案中去。如果除了控制檯輸出之外還想寫日誌檔案,則需要在application.properties
logging.file
或logging.path
屬性。
-
logging.file:將日誌寫入到指定的檔案中,預設為相對路徑,可以設定成絕對路徑。
如:
logging.file=my.log
-
logging.path:將名為
spring.log
寫入到指定的資料夾中,如(/var/log
)
如果只配置 logging.file
,會在專案的當前路徑下生成一個 xxx.log
日誌檔案。 如果只配置 logging.path
,在 /var/log
資料夾生成一個日誌檔案為 spring.log
日誌檔案在達到10MB
spring.1.log、spring.2.log
),新的日誌依舊輸出到spring.log
中去,預設情況下會記錄ERROR
、WARN
、INFO
級別訊息。
-
logging.file.max-size:限制日誌檔案大小
-
logging.file.max-history:限制日誌保留天數
日誌輸出
SpringBoot
預設為我們輸出的日誌級別為INFO
、WARN
、ERROR
,如需要輸出更多日誌的時候,可以通過以下方式開啟
-
命令模式配置:
java -jar app.jar --debug=true
, 這種命令會被SpringBoot
-
資原始檔配置:
application.properties
配置debug=true
即可。該配置只對 嵌入式容器、Spring、Hibernate生效,我們自己的專案想要輸出DEBUG需要額外配置(配置規則:logging.level.<logger-name>=<level>)
日誌輸出級別配置
logging.level.root = WARN
logging.level.org.springframework.web = DEBUG
logging.level.org.hibernate = ERROR
#比如 mybatis sql日誌
logging.level.org.mybatis = INFO
logging.level.mapper所在的包 = DEBUG
日誌輸出格式配置
-
logging.pattern.console:定義輸出到控制檯的格式(不支援JDK Logger)
-
logging.pattern.file:定義輸出到檔案的格式(不支援JDK Logger)
Logback擴充套件配置
該擴充套件配置僅適用logback-spring.xml
或者設定logging.config
屬性的檔案,因為logback.xml
載入過早,因此無法獲取SpringBoot
的一些擴充套件屬性
使用擴充套件屬性springProfile
與springProperty
讓你的logback-spring.xml
配置顯得更有逼格,當別人還在苦苦掙扎弄logback-{profile}.xml的時候 你一個檔案就搞定了
springProfile
<springProfile name="dev">
<!-- 開發環境時啟用 -->
</springProfile>
<springProfile name="dev,test">
<!-- 開發,測試的時候啟用-->
</springProfile>
<springProfile name="!prod">
<!-- 當 "生產" 環境時,該配置不啟用-->
</springProfile>
springProperty
<springProperty>
標籤可以讓我們在Logback中使用 Spring Environment 中的屬性。如果想在logback-spring.xml
中回讀application.properties
配置的值時,這是一個非常好的解決方案
<!-- 讀取 spring.application.name 屬性來生成日誌檔名
scope:作用域
name:在 logback-spring.xml 使用的鍵
source:application.properties 檔案中的鍵
defaultValue:預設值
-->
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="myapp.log"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/${logName}.log</file>
</appender>
動態修改日誌級別
方法一
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* @Author: ynz
* @Date: 2018/12/22/022 8:48
*/
public class LogUtil {
public static void setAllLogLevel(String level){
LoggerContext loggerContext= (LoggerContext) LoggerFactory.getILoggerFactory();
List<Logger> loggerList = loggerContext.getLoggerList();
for(Logger logger : loggerList){
logger.setLevel(Level.toLevel(level));
}
}
}
測試類
@RestController
@Slf4j
public class LogController {
/**
* 測試日誌等級
* @return
*/
@RequestMapping("/loglevel")
public String logLevel(){
log.debug("debug log");
log.info("info log");
log.error("error log");
return "success";
}
/**
* 設定日誌等級
* @param level
* @param packages
* @return
*/
@RequestMapping("/changeLog/{level}")
public String changeLevel(@PathVariable String level, @RequestBody String packages){
if(StringUtils.isEmpty(packages)){
LogUtil.setAllLogLevel(level);
}else{
LogUtil.setLogLevel(packages,level);
}
return "success";
}
}
訪問http://127.0.0.1:8080/changeLog/debug
,訊息體為cn
,可以看到日誌等級已經為debug
方法二
新增依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml新增配置
management.endpoints.web.exposure.include: loggers
#顯示健康具體資訊 預設不會顯示詳細資訊
management.endpoint.health.show-details: always
現在修改cn
包下的所有日誌等級改為DEBUG實現:
通過以送Post請求到http://127.0.0.1:8080/actuator/loggers/cn端點,請求體body內容
{
"configuredLevel": "DEBUG"
}