1. 程式人生 > 其它 >springboot日誌按級別按天並且按大小切割

springboot日誌按級別按天並且按大小切割

技術標籤:軟知識springboot日誌分級springboot日誌分目錄springboot日誌按天springboot日誌按大小log4j2

一、簡介

為了方便查詢問題,將日誌按info、error級別等輸出到日誌檔案。

若是用一個檔案來儲存所有的日誌,那麼這個檔案會越來越大,不利於我們查詢日誌。

所以這裡我們將日誌按日期儲存,每天都會建立一個對應日期的資料夾來存放當天的日誌檔案。

並且為了不讓日誌檔案太大,影響我們查詢,因此在日期資料夾中還需要按大小來切割成多個日誌檔案存放。

使用的是SpringBoot+log4j2。

將springboot專案打包成jar包執行,日誌的配置依然有效。使用java -jar demo.jar執行jar包,日誌會輸出到設定的目錄中。

二、實踐

1.建立springboot專案,pom檔案如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 去除日誌預設配置 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- log4j2 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <version>1.5.6.RELEASE</version>
        </dependency>

        <!-- 支援識別yml配置 -->
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.在resources資料夾下建立log4j2.yml檔案,內容如下:

Appenders:
  Console:  #輸出到控制檯
    name: CONSOLE #Appender命名
    target: SYSTEM_OUT
    PatternLayout:
      pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" #輸出日誌的格式
  RollingFile: # 輸出到檔案
    - name: RollingFileInfo #複數加上-   info級別的日誌設定
      ignoreExceptions: false #是否忽略異常
      fileName: D://logs/info.log #日誌地址
      filePattern: "D://logs/info/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log" #日誌超過設定的限制大小則另外新建檔案
      PatternLayout:
        pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"  #輸出日誌格式
      Policies:
        SizeBasedTriggeringPolicy:
          size: "3 KB"  #限制日誌檔案大小為3kb,超出3kb則另外建立日誌檔案,可以根據實際修改這個大小
      DefaultRolloverStrategy:
        max: 1000 #同一資料夾1000個檔案開始覆蓋,不設定的話預設7個檔案開始覆蓋
      ThresholdFilter:
        level: "info" #日誌級別
        onMatch: "ACCEPT" #info及以上級別則列印
        onMismatch: "DENY"  #info以下級別不列印
    - name: RollingFileError #複數加上-  error級別的日誌設定,同info類似
      ignoreExceptions: false
      fileName: D://logs/error.log
      filePattern: "D://logs/error/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"
      PatternLayout:
        pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"
      Policies:
        SizeBasedTriggeringPolicy:
          size: "3 KB"
      DefaultRolloverStrategy:
        max: 1000
      ThresholdFilter:
        level: "error"
        onMatch: "ACCEPT"
        onMismatch: "DENY"
Loggers:
  Root:
    level: info     #日誌級別
    AppenderRef:
      - ref: CONSOLE #複數加上-
      - ref: RollingFileInfo
      - ref: RollingFileError
  Logger: #單獨設定某些包的輸出級別
    - name: com.example.demo #複數加上-(這裡我設定的是包的根路徑的包名)
      additivity: false #去除重複的log
      level: info
      AppenderRef:
        - ref: CONSOLE #複數加上-
        - ref: RollingFileInfo #複數加上-
        - ref: RollingFileError #複數加上-

這裡我是在window系統執行的,所以日誌檔案目錄是window格式的,若是在linux系統的話,改成對應的路徑格式就行了。

這裡我輸出了info及以上級別的日誌檔案和單獨error級別的日誌檔案。

3.建立controller檔案,方便呼叫來輸出日誌

package com.example.demo.controller;

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 TestController {
    Logger logger = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/test")
    public String test(){
        logger.info("test success");
        logger.error("test error");
        return "success";
    }
}

這樣就可以開始測試了。

三、測試

1.啟動專案,檢視日誌目錄

可以看到自動生成了日誌目錄和檔案

2.呼叫介面列印日誌

http://localhost:8080/test

之後檢視日誌檔案,可以看到輸出了對應的日誌。

3.多次呼叫介面列印日誌

多次列印日誌後,當日志文件超過3kb時,將開始建立資料夾來存放對應的日誌,並且按大小分割成多個日誌檔案儲存。