Springboot中slf4j+log4j2的使用


Springboot中slf4j+log4j2的使用

0.簡介

slf4j: 日志門面

log4j2: 日志實現

我要是直接用log4j2打日志當然可以,但是我想換的時候,就需要修改很多代碼.

比如說導入的日志類啊,logger的聲明啊等等.

但是我可以讓slf4j來做,slf4j是多個日志框架的上層,大家都基於slf4j來做.

這樣,要切換具體的日志框架時,只用換個依賴那些就好了, 代碼之類的不用任何修改.

這就是面向接口編程的思想,方法形參放置接口,運行時傳入不同的實現類,就能產生出不同的實現效果.

image-20210719192859747

1.導入pom

        <!-- log4j2依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

2.排除默認的logback

默認的是logback,需要在pom中排除掉這個默認的.

此處排的是spring-boot-starter中的.

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                 <!-- 20210714去掉logback配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                 <!-- 20210714去掉logback配置 end -->
                <exclusion>
                    <artifactId>logback-classic</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>
            </exclusions>
        </dependency>

如果依賴的比較細,是具體的spring-boot-starter-xx,就在這些細的依賴里面排除下,例如.

        <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>

3.編寫配置文件

放到項目的resources目錄下即可

文件名:log4j2.xml

<?xml version="1.0" encoding="utf-8"?>
<!--status:log4j包內部日志等級 600s刷新一次配置 -->
<Configuration status="WARN" monitorInterval="600">
    <!-- 參數聲明 -->
    <Properties>
        <!-- 日志文件存放根路徑 -->
        <property name="DEFAULT_LOG_ROOT_PATH" value="./"/>
        <!-- 日志格式 -->
        <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} -- %style{[%t]}{bright,magenta} %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} %logger{36}.%M - %msg%n"/>
        <!-- 日志文件最大文件大小全局配置,單位可以為KB、MB或GB,一天之內最大文件產生數量全局配置 -->
        <property name="MAX_FILE_SIZE" value="100MB"/>
        <property name="MAX_FILE_NUM" value="30"/>

        <!-- debug 日志文件位置及名稱,在rollFile的時候老文件的生成規則 -->
        <property name="DEBUG_FILE_PATH_ING" value="${DEFAULT_LOG_ROOT_PATH}/logs/current/debug.log"/>
        <!--  filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"> 備份時使用gz格式壓縮-->
        <property name="DEBUG_FILE_PATH_ED" value="${DEFAULT_LOG_ROOT_PATH}/logs/history/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}.%i.log"/>

        <!-- info 日志文件位置及名稱,在rollFile的時候老文件的生成規則 -->
        <property name="INFO_FILE_PATH_ING" value="${DEFAULT_LOG_ROOT_PATH}/logs/current/info.log"/>
        <property name="INFO_FILE_PATH_ED" value="${DEFAULT_LOG_ROOT_PATH}/logs/history/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}.%i.log"/>

        <!-- error 日志文件位置及名稱,在rollFile的時候老文件的生成規則 -->
        <property name="ERROR_FILE_PATH_ING" value="${DEFAULT_LOG_ROOT_PATH}/logs/current/error.log"/>
        <property name="ERROR_FILE_PATH_ED" value="${DEFAULT_LOG_ROOT_PATH}/logs/history/$${date:yyyy-MM-dd}/error-%d{yyyy-MM-dd}.%i.log"/>

        <!-- warn 日志文件位置及名稱,在rollFile的時候老文件的生成規則 -->
        <property name="WARN_FILE_PATH_ING" value="${DEFAULT_LOG_ROOT_PATH}/logs/current/warn_error.log"/>
        <property name="WARN_FILE_PATH_ED" value="${DEFAULT_LOG_ROOT_PATH}/logs/history/$${date:yyyy-MM-dd}/warn_error-%d{yyyy-MM-dd}.%i.log"/>
    </Properties>

    <appenders>
        <!-- 控制台輸出日志信息 -->
        <console name="Console_Log" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </console>
        <!-- debug日志文件輸出日志信息 -->
        <RollingFile name="Debug_File" fileName="${DEBUG_FILE_PATH_ING}" filePattern="${DEBUG_FILE_PATH_ED}">
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="${MAX_FILE_NUM}"/>
        </RollingFile>
        <!-- info日志文件輸出日志信息 -->
        <RollingFile name="Info_File" fileName="${INFO_FILE_PATH_ING}" filePattern="${INFO_FILE_PATH_ED}">
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="${MAX_FILE_NUM}"/>
        </RollingFile>
        <!-- warn日志文件輸出日志信息 -->
        <RollingFile name="Warn_File" fileName="${ERROR_FILE_PATH_ING}" filePattern="${ERROR_FILE_PATH_ED}">
            <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="${MAX_FILE_NUM}"/>
        </RollingFile>
        <!-- error日志文件輸出日志信息 -->
        <RollingFile name="Error_File" fileName="${ERROR_FILE_PATH_ING}" filePattern="${ERROR_FILE_PATH_ED}">
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="${MAX_FILE_NUM}"/>
        </RollingFile>
    </appenders>
    <!--配置總的日志監聽級別-->
    <loggers>
        <root level="INFO">
            <appender-ref ref="Console_Log"/>
            <appender-ref ref="Debug_File"/>
            <appender-ref ref="Info_File"/>
            <appender-ref ref="Error_File"/>
        </root>
    </loggers>
</Configuration>

配置文件示例2

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    status="warn" 日志框架本身的輸出日志級別,可以修改為debug
    monitorInterval="5" 自動加載配置文件的間隔時間,不低於 5秒;生產環境中修改配置文件,是熱更新,無需重啟應用
 -->
<configuration status="warn" monitorInterval="5">
    <!--
    集中配置屬性進行管理
    使用時通過:${ }
    -->
    <properties>
        <property name="LOG_HOME">D:\ProjectFiles\1-IntelliJIDEAWorks\YangStudy\logs</property>
    </properties>

    <!-- 日志處理 -->
    <Appenders>
        <!-- 控制台輸出 appender,SYSTEM_OUT輸出黑色,SYSTEM_ERR輸出紅色 -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" />
        </Console>

        <!-- 日志文件輸出 appender -->
        <File name="file" fileName="${LOG_HOME}/myfile.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
        </File>

        <!-- 使用隨機讀寫流的日志文件輸出 appender,性能提高 -->
        <RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
        </RandomAccessFile>

        <!-- 按照一定規則拆分的日志文件的appender -->  <!-- 拆分后的文件 -->

        <!-- filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log"> -->
        <RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd}-%i.log">
            <!-- 日志級別過濾器 -->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
            <!-- 日志消息格式 -->
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %msg%n" />
            <Policies>
                <!-- 在系統啟動時,出發拆分規則,生產一個新的日志文件 -->
                <OnStartupTriggeringPolicy />
                <!-- 按照文件大小拆分,10MB -->
                <SizeBasedTriggeringPolicy size="2MB" />
                <!-- 按照時間節點拆分,規則根據filePattern定義的 -->
                <TimeBasedTriggeringPolicy />
            </Policies>
            <!-- 在同一個目錄下,文件的個限定為 30個,超過進行覆蓋 -->
            <DefaultRolloverStrategy max="10" />
        </RollingFile>

    </Appenders>

    <!-- logger 定義 -->
    <Loggers>
        <!-- 使用 rootLogger 配置 日志級別見第5節 -->
        <Root level="trace">
            <!-- 指定日志使用上面哪個處理器 -->
            <AppenderRef ref="Console" />
            <AppenderRef ref="file" />
            <AppenderRef ref="rollingFile" />
            <AppenderRef ref="accessFile" />
        </Root>
    </Loggers>
</configuration>

4.使用

類上面加注解@Slf4j

// info
log.info("請求地址: "+ request.getRequestURI());
// 占位符的使用{}
log.info("<< | {} | 返回給調用方的響應的報文:\n {}", msgId, JSON.toJSONString(sxResponse));
// << | msgId | 返回給調用方的響應的報文:\n JSON.toJSONString(sxResponse)", msgId, JSON.toJSONString(sxResponse)

5.日志級別

通過改變配置文件中的日志級別,就能打印出不同的日志.

eg: 有的場景只是你在debug的時候看看,所以你代碼寫log.debug(),有的信息你經常想看到,所以你代碼寫log.info().

由於級別info>debug,所以在配置文件中設置級別為debug時能看到debug+info的信息,設置級別為info時就可以不看到debug的信息.

在log4j2中, 共有8個級別,按照從低到高為:

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
  • All:最低等級的,用於打開所有日志記錄.
  • Trace:是追蹤,就是程序推進一下.
  • Debug:指出細粒度信息事件對調試應用程序是非常有幫助的.
  • Info:消息在粗粒度級別上突出強調應用程序的運行過程.
  • Warn:輸出警告及warn以下級別的日志.
  • Error:輸出錯誤信息日志.
  • Fatal:輸出每個嚴重的錯誤事件將會導致應用程序的退出的日志.
  • OFF:最高等級的,用於關閉所有日志記錄.


免責聲明!

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



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