Spring boot 最簡單寫 Log 教學(輸出到檔案)

Spring boot 預設支援 Java Util Logging, Log4J2, Logback 來記錄 Log,新專案在執行時,就會看到有資訊輸出在控制台,代表已經有在寫 log ,只是並沒有將這些 log 紀錄輸出到檔案中而已

程式中印出 Log

在將 log 輸出到檔案前,我們先來看看要怎麼寫 log,下面是一個簡單的 controller :
	

package app.ruyut.example.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/home")
public class HomeController {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @GetMapping(value = {"","/", "/home"})
    public String index() {

        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");

        return "Hello";
    }
}

	

log 的層級從低到高分別為 trace, debug, info, warn, error, 預設只會顯示 info 和更高等級的 log。
如果想要全部輸出,可以在設定檔(application.properties)中增加下面這行:
	
logging.level.root=TRACE
	

在預設設定檔中設定輸出 log 檔案

要將 log 輸出到檔案最簡單的方式,就是在設定檔(application.properties)中增加輸出的日誌檔檔名即可,設定方式如下:
	
    logging.file.name=log.log
	

log 檔案就會被輸出到專案目錄下:

要替換路徑的話也很簡單,例如下方的設定是將日誌檔輸出到專案資料夾下 log 資料夾內,檔名為 log.log:
	
    logging.file.name=./log/log.log
	

如果要限制日誌檔案大小和超過大小自動拆分檔案的話也可以增加下面的設定(單檔案最大 10 MB,檔案上限 90 個):
	
logging.logback.rollingpolicy.max-history=90
logging.logback.rollingpolicy.max-file-size=10MB
	

之後超過的檔案會自動被壓縮,以下面的形式出現:

使用 logback.xml 設定 log 相關設定

剛剛介紹了使用 Spring boot 設定檔 —— application.properties 來簡單的讓 log 可以被輸出到檔案中,但是這樣會有很多限制,例如筆者就沒有找到方法讓一開始輸出的檔案自訂為當天日期。

將 logback.xml 放置到下列位置:
    
C:\Users\wusnn\Documents\test\example
|-- pom.xml
|-- src
|   |-- main
|   |   |-- java/
|   |   `-- resources
|   |       |-- application.properties
|   |       `-- logback.xml
|   `-- test/
`-- target/
    

在使用 logback.xml 設定檔的情況下,預設是不會把 log 輸出到指令視窗上的,因為「輸出到指令視窗上」這件事情在 logback.xml 中沒有被定義,所以我們可以先使用下面的內容,確保能夠維持原本的輸出 log 功能。
	
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--加這行才會保有指令視窗的預設輸出格式-->
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

</configuration>

	

如果想要將 log 輸出到檔案並設定檔案大小和設定最多保留檔案數量可以使用以下內容:
	
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="LOGS" value="./logs"/>
    <property name="APP_NAME" value="ruyut"/>

    <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="UTF-8">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%t] %C{1.}: %msg%n%throwable</Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS}/${APP_NAME}-%d{yyyyMMdd}-%i.log</fileNamePattern>
            <maxHistory>90</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="RollingFile"/>
    </root>

</configuration>


	

完整設定檔內容:
	
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--加這行才會保有指令視窗的預設輸出格式-->
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <property name="LOGS" value="./logs"/>
    <property name="APP_NAME" value="ruyut"/>

    <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="UTF-8">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%t] %C{1.}: %msg%n%throwable</Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS}/${APP_NAME}-%d{yyyyMMdd}-%i.log</fileNamePattern>
            <maxHistory>90</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="RollingFile"/>
    </root>

</configuration>


	



參考資料:
Part IV. Spring Boot features 26. Logging

留言