如何將不同業務模塊產生的日志 分多文件記錄


在項目中如果把所有的日志都記到一個 info.log 分析起來會很麻煩,中間夾着不同業務產生的日志,所以我們需要將不同的業務日志拆分到不同的文件中,便於日志分析。

一般日志文件的命名為:xxx.info.log 、xxx.error.log,如下圖

 一般 error 的日志我們重點關注。如果業務日志文件多了,找起來比較麻煩(當然也可以用 搜索 *.error.log)

我們在項目中會將 error 放在開頭(也可以按文件夾來划分,比如將 api 建成一個文件夾)這樣查找起來比較方便,如下圖

在logback.xmp中,根據業務合理分析定義日志文件保存規則

 

然后再按 領域、業務,命名業務日志文件,如不同廠家的接口,可以命名為:api_廠商_業務_info.log ,


 以下基於 LogBack 日志類實現的demo , LogBack 是 log4j 的升級版, 基於 slf4j 的實現,(log4j、slf4j、logback  是同一作者)

log4j2 是Apache 的產品,和 log4j 不是一個人寫的。名字有點坑

 

代碼如下

LogTests.java
package com.iron.demo;

import com.iron.demo.utility.LogFileName;
import com.iron.demo.utility.LoggerUtils;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest
class LogTests {

    Logger LOG_API_HIS_PRESCRIPTION = LoggerUtils.Logger(LogFileName.LOG_API_HIS_PRESCRIPTION);
    Logger LOG_API_IRON_PRESCRIPTION = LoggerUtils.Logger(LogFileName.LOG_API_IRON_PRESCRIPTION);

    @Test
    public void testBusinessLog() throws Exception {
        LOG_API_HIS_PRESCRIPTION.info("HIS 接口產生的相關日志...");
        for (int i = 0; i < 5; i++) {
            LOG_API_IRON_PRESCRIPTION.info("Iron 設備相關的業務日志..."+i);
        }
        LOG_API_HIS_PRESCRIPTION.error("HIS 接口產生的【錯誤】日志...");
        LOG_API_IRON_PRESCRIPTION.error("Iron 接口產生的【錯誤】日志...");
    }
}
LogFileName.java
package com.iron.demo.utility;

public enum LogFileName {

    //配置到logback.xml中的logger name="apiHis"
    LOG_API_HIS_PRESCRIPTION("apiHis"),
    LOG_API_IRON_PRESCRIPTION("apiIron");

    private String logFileName;

    LogFileName(String fileName) {
        this.logFileName = fileName;
    }

    public String getLogFileName() {
        return logFileName;
    }

    public void setLogFileName(String logFileName) {
        this.logFileName = logFileName;
    }

    public static LogFileName getAwardTypeEnum(String value) {
        LogFileName[] arr = values();
        for (LogFileName item : arr) {
            if (null != item && item.logFileName == null && !(item.logFileName.trim().isEmpty())) {
                return item;
            }
        }
        return null;
    }
}
LoggerUtils.java【如果這個辦不放其它該當,就是多余的類,可直接使用 LoggerFactory.getLogger 】
package com.iron.demo.utility;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerUtils {
    /**
     * 傳統默認的記錄方式
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> Logger Logger(Class<T> clazz) {
        return LoggerFactory.getLogger(clazz);
    }

    /**
     * 記錄到指定的文件下
     *
     * @param desc 日志文件名稱
     * @return
     */
    public static Logger Logger(LogFileName desc) {
        return LoggerFactory.getLogger(desc.getLogFileName());
    }
}

logback.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
    <!--<property name="LOG_HOME" value="${LOG_HOME}" />-->
    <property name="LOG_HOME" value="./logs" />
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="UTF-8">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %highlight([%-5level] %logger{50} - %msg%n)</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <appender name="SYS_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/info.log</File>
        <append>true</append>
        <!--過濾器,只打INFO級別的日志,日志文件最多保留15天(如果是按天滾動)-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/info.log.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>15</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="SYS_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/error.log</File>
        <append>true</append>
        <!--過濾器,只打ERROR級別的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>15</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--不同業務產生的日志打印到不同文件中-->
    <appender name="API_HIS_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/api_his_info.log</File>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/api_his_info.log.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="API_HIS_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/error_api_his.log</File>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error_api_his.log.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="API_IRON_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/api_iron_info.log</File>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/api_iron_info.log.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="API_IRON_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/error_api_iron.log</File>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error_api_iron.log.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--設置 com.iron.demo 包空間下面的日志 level 顯示-->
    <logger name="com.iron.demo" level="INFO"/>


    <!-- 不同的業務邏輯日志打印到指定文件中 && info 和 error 分開  additivity=false 不會加到 SYS_XXX 默認系統日志中,在使用 Spring Boot Admin 時,需要將這個去掉,因為Spring Boot Admin-Client 只能指定一個日志文件, -->
    <logger name="apiHis" level="INFO">
        <appender-ref ref="API_HIS_INFO"/>
    </logger>
    
    <logger name="apiIron" additivity="false" level="INFO">
        <!--打到控制台-->
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="API_IRON_INFO"/>
        <appender-ref ref="API_IRON_ERROR"/>
    </logger>

    <!--系統級的日志(默認) info和error分開打印-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="SYS_INFO"/>
        <appender-ref ref="SYS_ERROR"/>
    </root>

</configuration>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM