1. 程式人生 > >Springboot2(1)日誌配置和動態日誌等級設定

Springboot2(1)日誌配置和動態日誌等級設定

Spring Boot內部採用的是Commons Logging進行日誌記錄,但在底層為Java Util Logging、Log4J2、Logback等日誌框架提供了預設配置 。Java 雖然有很多可用的日誌框架,但請不要擔心,一般來說,使用SpringBoot預設的Logback就可以了。

注意點

  1. springboot預設的日誌等級是INFO

  2. 要通過logging.file或者logging.path配置springboot日誌的輸出

檔案儲存

預設情況下,SpringBoot僅將日誌輸出到控制檯,不會寫入到日誌檔案中去。如果除了控制檯輸出之外還想寫日誌檔案,則需要在application.properties

設定logging.filelogging.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中去,預設情況下會記錄ERRORWARNINFO級別訊息。

  • logging.file.max-size:限制日誌檔案大小

  • logging.file.max-history:限制日誌保留天數

日誌輸出

SpringBoot預設為我們輸出的日誌級別為INFOWARNERROR,如需要輸出更多日誌的時候,可以通過以下方式開啟

  • 命令模式配置: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的一些擴充套件屬性

使用擴充套件屬性springProfilespringProperty讓你的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"
}

原始碼地址:https://gitee.com/cowboy2016/springboot2-open