iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

Day13 - Logging

前言

我們知道Java的Logging可以分為日誌門面(Facade)與日誌框架(Logging Framework),使用門面的好處是你可以抽換底層的實作。看到下圖發現還真不少耶,就讓我們往下看看Spring Boot怎麼整合這些日誌吧!
https://ithelp.ithome.com.tw/upload/images/20230929/20128084Ac0xCCupII.png

專案建立

創建day13_logging module

https://ithelp.ithome.com.tw/upload/images/20230929/20128084L868bdgIZj.png
https://ithelp.ithome.com.tw/upload/images/20230929/20128084Dyukz0P9L5.png

Logging

簡介

Spring Boot使用Commons Logging作為內部的logging,但當使用Starters時Spring Boot使用的是SLF4J+Logback的組合
https://ithelp.ithome.com.tw/upload/images/20230929/20128084xJbW7ZyhfV.png
Logging是系統一啟動就要使用的,故配置是透過Listener的方式,而xxxAutoConfiguration是系統啟動後進行自動裝配使用的
https://ithelp.ithome.com.tw/upload/images/20230929/20128084Q2oakT7DSx.png

Log Format

2023-09-29T03:32:57.262+08:00  INFO 20020 --- [           main] com.swj.Day13LoggingApplication          : Starting Day13LoggingApplication using Java 17.0.7 with PID 20020 (H:\workspace_idea\ironman-2023\day13_logging\target\classes started by James in H:\workspace_idea\ironman-2023)
2023-09-29T03:32:57.265+08:00  INFO 20020 --- [           main] com.swj.Day13LoggingApplication          : No active profile set, falling back to 1 default profile: "default"

  • 時間日期精確到毫秒
  • 日誌級別:ERROR、WARN、INFO、DEBUG、TRACE,注意Logback沒有FATAL,對應的是ERROR
  • ---:分割符號
  • Procss ID (PID)
  • 執行緒名稱
  • log訊息
    以下是一個簡單的修改不難看出%打頭的就是代表變數,可以對照log一起看
logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n'

2023-09-29 03:47:33.483 INFO  [main] o.a.c.c.StandardService ===> Starting service [Tomcat]

Log Levels

  1. 由低到高:ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
  • ALL:印出所有級別日誌
  • TRACE:追蹤詳細流程,一般不使用
  • DEBUG:開發細節日誌
  • INFO:關鍵訊息日誌
  • WARN:警告訊息
  • ERROR:業務錯誤日誌,例如:XXXException
  • FATAL:致命日誌,例如:JVM系統crash
  • OFF:關閉日誌
  1. root代表所有未指定日誌級別都使用的級別,可透過logging.level.root設定
  2. Spring Boot預設級別是INFO
logging:
  level:
    root: "warn"
    org.springframework.web: "debug"
    org.hibernate: "error"

Log Groups

可以將相關的日誌設在同一個組別,Spring Boot提供兩個預設組別
https://ithelp.ithome.com.tw/upload/images/20230929/20128084JzuebdUa4x.png
範例如下

logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n'
  group:
    tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
    core-group:
      - "com.swj.controller"
      - "com.swj.service"
  level:
    root: info
    web: debug
    sql: trace
    tomcat: off
    core-group: debug

切換Log組合

切換Log實作其實很簡單,只要排除預設的spring-boot-starter-logging,導入其它的就可以了,例如spring-boot-starter-log4j2,以下是maven設定

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

Custom Log Configuration

官方文件有說只要在日誌設定檔中加入-spring設定檔就可以被交給Spring來初始化,是不是很方便呢,至於官方文件有提到更多可供設定的Property可點上方標題連結參考
https://ithelp.ithome.com.tw/upload/images/20230929/20128084JbxwkpawSo.png

File Output

在未設log的file name與file path則log只會在console輸出
https://ithelp.ithome.com.tw/upload/images/20230929/20128084xLJ9nXGASM.png

File Rotation

如果使用Logback調整File Rotation設定可以直接在application.properties或application.yaml中設置,但是其它日誌框架就要自己寫設定檔了

  • 預設file-name-pattern:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
  • 預設clean-history-on-start:false
  • 預設max-file-size:10MB
  • 預設max-history:0B,若設置1G則超過1GB日誌就換刪除舊日誌文件
  • 預設max-history:7天
    https://ithelp.ithome.com.tw/upload/images/20230929/20128084f9nMY7G38o.png

補充@Slf4j

當使用lombok時,在class上方加上這個註解,就可以用log來寫log了

@Slf4j
public class HelloController {
    //傳統寫法
    //Logger logger = LoggerFactory.getLogger(getClass());
    @GetMapping("/hello")
    public String Hello(){
        log.info("Welcome to Hello api");
        return "Hello";
    }
}

Reference


上一篇
Day12 - yaml配置文件用法
下一篇
Day14 - Web開發:Spring MVC Auto-configuration
系列文
我在 Spring Boot 3 裡面挖呀挖呀挖31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言