本篇主要介紹Logging的機制,Spring boot預設為logback framework,在開始之前先給大家熱身一下,每次執行Spring boot程式在Console上都會看到Spring的Banner如下
這Banner可以自訂喔,可以在google輸入ascii generator關鍵字,就可以找到很多產生這Banner文件,我使用的是這個,然後在/src/main/resources目錄中增加一個banner.txt檔案,然後把產生出來的Code複製到banner.txt的檔案上,也可以透過簡單的設定加上一些顏色
banner.txt
有點跑掉不過執行結果如下:
這Banner可以自訂喔,可以在google輸入ascii generator關鍵字,就可以找到很多產生這Banner文件,我使用的是這個,然後在/src/main/resources目錄中增加一個banner.txt檔案,然後把產生出來的Code複製到banner.txt的檔案上,也可以透過簡單的設定加上一些顏色
banner.txt
${AnsiColor.BRIGHT_BLUE}
_ _______ _________ _______ _______
( \ ( ___ )|\ /|\__ __/( ____ \/ ___ )
| ( | ( ) || ) ( | ) ( | ( \/\/ ) |
| | | | | || | | | | | | (_____ / )
| | | | | || | | | | | (_____ ) / /
| | | | | || | | | | | ) | / /
| (____/\| (___) || (___) |___) (___/\____) | / (_/\
(_______/(_______)(_______)\_______/\_______)(_______/
${AnsiColor.BRIGHT_GREEN}
Application Version: ${application.version}${application.formatted-version}
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
有點跑掉不過執行結果如下:
這個banner.txt後續也會有一些實質的幫助喔。
Logging在程式開發中是一個基本、必要且非常重要的一項工作,先跟大家說明之後相關範例說明都有 log 可以查看相當方便,也可以習慣這樣的方式,不要甚麼都是System.out,在一個專案或是系統建置成功與否,logging機制相當重要,然後上線後的維運、遇到問題更是仰賴的根本,只要能知道原因就能解決,想要知道原因就一定要很清楚logging的處理方式。
學習目的:使用logback進行log。
學習時數:1.5 hr
教學影片:pom.xml 說明(logback為預設值,不用額外設定,同Spring boot v1.5(一))
spring-boot-starter-web:配置 Web Project所需的函式庫
spring-boot-starter-test:配置 unit or mock test 所需的函式庫
spring-boot-starter-actuator:配置監控spring boot所需的函式庫,後續spring cloud會使用到,所以一開就導入
application.properties說明
#應用程式名稱 spring.application.name=Louisz Spring boot #程式啟動 listener port or server.port = 0 自動 server.port = 8090 #選擇需要紀錄的package logging.level.org.springframework.web=DEBUG logging.level.louisz.springboot.example2=DEBUG #將log記錄到指定的檔案中 logging.file=louisz.log #顯示可以有色彩的屬性 spring.output.ansi.enabled= always #建議使用logback設定檔案 logging.config=src/main/resources/logback-spring.xml在 /src/main/resources/ 下增加 logback-spring.xml設定檔,簡易內容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 使用預設值得base.xml --> <include resource="org/springframework/boot/logging/logback/base.xml"/> <!-- 選擇要記錄的package,並設定只要大於等於debug等級,就記錄下來 --> <logger name="org.springframework.web" level="DEBUG"/> </configuration>
run example2
測試以下幾個網址,是否有log下來相關資訊 http://localhost:8090/log_debug http://localhost:8090/log_info
進階版的 logback 設定
<!-- <configuration>
使用logback的基本設定
<include resource="org/springframework/boot/logging/logback/base.xml"/>
指定特定目錄進行log,等級設為WARN,分別記錄在Console及檔案
<logger name="louisz.springboot.example1" level="WARN" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
指定特定目錄進行log,等級設為DEBUG,分別記錄在Console及檔案
<logger name="louisz.springboot.example2" level="DEBUG" additivity="true">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
</configuration> -->
<!-- 全部進行Debug level紀錄,並且每30秒監控設定檔是否有異動 -->
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<!-- 記錄檔存放路徑 -->
<property name="LOG_PATH" value="logs" />
<!-- 歷史記錄檔存放路徑 -->
<property name="LOG_ARCHIVE" value="${LOG_PATH}/archive" />
<!-- 檔名規則 -->
<timestamp key="timestamp-by-second" datePattern="yyyyMMdd'T'HHmmss"/>
<appender name="Console-Appender" class="ch.qos.logback.core.ConsoleAppender">
<layout>
<!-- 紀錄存放格式 -->
<pattern>%d %-5level [%thread] %logger{0} : %msg%n</pattern>
</layout>
</appender>
<!-- 歷史記錄檔搬移規則及存放路徑 -->
<appender name="File-Appender" class="ch.qos.logback.core.FileAppender">
<file>${LOG_PATH}/logfile-${timestamp-by-second}.log</file>
<encoder>
<pattern>%d %-5level [%thread] %logger{0} : %msg%n</pattern>
<!-- 套用格式規則置頂 -->
<outputPatternAsHeader>true</outputPatternAsHeader>
</encoder>
</appender>
<!-- 記錄檔異動規則 -->
<appender name="RollingFile-Appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/rollingfile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_ARCHIVE}/rollingfile.log%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1KB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d %-5level [%thread] %logger{0} : %msg%n</pattern>
</encoder>
</appender>
<!-- 非同步方式進行紀錄 -->
<appender name="Async-Appender" class="ch.qos.logback.classic.AsyncAppender">
<!-- 套用至RollingFile-Appender -->
<appender-ref ref="RollingFile-Appender" />
</appender>
<!-- 紀錄套用package、level等 -->
<logger name="louisz.springboot.example2" level="debug" additivity="false">
<appender-ref ref="Console-Appender" />
<appender-ref ref="File-Appender" />
<appender-ref ref="Async-Appender" />
</logger>
<root>
<appender-ref ref="Console-Appender" />
</root>
</configuration>
程式碼說明
- Example2.java
package louisz.springboot.example2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Louisz Spring boot introduce ex.2
*
*/
@SpringBootApplication
public class Example2 {
/**
* 程式執行起點
*
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(Example2.class, args);
}
}
- Ex2Controller.java
package louisz.springboot.example2;
//採用的是slf4j外框
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Ex2Controller {
//請注意不要用static,才能使用this.getClass
private final Logger logger = LoggerFactory.getLogger(this.getClass());
//log level 設定為debug
@RequestMapping("/log_debug")
public String debug() {
logger.debug("This is debug msg.");
return "debug level";
}
//log level 設定為info
@RequestMapping("/log_info")
public String info() {
logger.info("This is info msg.");
return "info level";
}
//log level 設定為error
@RequestMapping("/log_error")
public String error() {
logger.debug("This is error msg.");
return "error level";
}
}
Github code(louisz.springboot.example2)
參考連結:
https://springframework.guru/using-logback-spring-boot/
https://springframework.guru/logback-configuration-using-xml/
http://blog.didispace.com/spring-boot-banner/
留言
張貼留言