天天看點

Spring Boot配置Slf4j + log4j2

之前在SpringBoot項目中使用的日志是Slf4j + Logback, 現在想換成Slf4j + log4j2, 但是在網上找了配置方式, 發現怎麼都不好使, 最後發現是jar包沖突了, 是以這裡貼出來針對的配置方式, 具體關于日志的一些講解說明這裡不多說, 可以去百度, 因為 ... 有一大堆 ... 都是抄襲, 就算不好使估計自己都不知道吧, 但是起碼講解說明都是有的, 可以去檢視. 最後希望copy黨, 能夠自己實踐一些你的copy好不好使, 不要盲目ctrl+c, ctrl+v就不管了

排除其他日志依賴

<!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <exclusions><!-- 去掉springboot預設配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion><!-- 去掉預設的logback日志配置 -->
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions><!-- 去掉springboot預設配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion><!-- 去掉預設的logback日志配置 -->
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
           

一開始我隻是排除了spring-boot-starter-web中的日志, 配置好log4j2的xml後, 發現怎麼都不好使, 最後使用 mvn dependency:tree 指令後發現, spring-boot-starter-jdbc中也存在沖突的日志jar, 也需要排除掉, 是以我又排除了一遍, 才好使!才好使!才好使! 我記得有方式可以一次性排除掉pom中的jar, 這裡在兩個地方排除了兩遍, 有點多餘, 希望大家能夠改進

引入log4j2的依賴

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

配置log4j2-spring.xml檔案

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

<!--Configuration後面的status,這個用于設定log4j2自身内部的資訊輸出,可以不設定,當設定成trace時,你會看到log4j2内部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 檔案和重新配置本身,設定間隔秒數-->
<configuration monitorInterval="5">

    <!--日志級别以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

    <!--變量配置-->
    <Properties>
        <!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級别從左顯示5個字元寬度 %msg:日志消息,%n是換行符-->
        <!-- %logger{36} 表示 Logger 名字最長36個字元 -->
        <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %C[%L] - %msg%n"/>
        <!-- 定義日志存儲的路徑 -->
        <property name="FILE_PATH" value="logs"/>
        <property name="FILE_NAME" value="demo-log4j2"/>
    </Properties>

    <appenders>

        <console name="Console" target="SYSTEM_OUT">
            <!--輸出日志的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--控制台隻輸出level及其以上級别的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        </console>

        <!--檔案會列印出所有資訊,這個log每次運作程式會自動清空,由append屬性決定,适合臨時測試用-->
        <File name="Filelog" fileName="${FILE_PATH}/file.log" append="false">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>

        <!-- 這個會列印出所有的info及以下級别的資訊,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的檔案夾下面并進行壓縮,作為存檔-->
        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log"
                     filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}-%i.log">
            <!--控制台隻輸出level及以上級别的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval屬性用來指定多久滾動一次,預設是1 hour, 這裡是按天列印, 主要看fileName的日期格式-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <!-- 按大小列印, 超過10MB, 同一天在加一個日志檔案, fileName的-%i  -->
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一檔案夾下7個檔案開始覆寫, 大于此值會删除舊的日志檔案-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

        <!-- 這個會列印出所有的warn及以下級别的資訊,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的檔案夾下面并進行壓縮,作為存檔-->
        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log"
                     filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}-%i.log">
            <!--控制台隻輸出level及以上級别的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval屬性用來指定多久滾動一次,預設是1 hour, 這裡是按天列印, 主要看fileName的日期格式-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <!-- 按大小列印, 超過10MB, 同一天在加一個日志檔案, fileName的-%i  -->
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一檔案夾下7個檔案開始覆寫, 大于此值會删除舊的日志檔案-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

        <!-- 這個會列印出所有的error及以下級别的資訊,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的檔案夾下面并進行壓縮,作為存檔-->
        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log"
                     filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}-%i.log">
            <!--控制台隻輸出level及以上級别的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval屬性用來指定多久滾動一次,預設是1 hour, 這裡是按天列印, 主要看fileName的日期格式-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <!-- 按大小列印, 超過10MB, 同一天在加一個日志檔案, fileName的-%i  -->
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一檔案夾下7個檔案開始覆寫, 大于此值會删除舊的日志檔案-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

    </appenders>

    <!--Logger節點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級别等-->
    <!--然後定義loggers,隻有定義了logger并引入的appender,appender才會生效-->
    <loggers>

        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="Filelog"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

</configuration>
           

以上的xml也是我從别的部落格友那裡搞來的, 但是都是經過本人實踐的, 確定沒問題, 請放心參考

測試

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class Log4j2Test {

    // <!--日志級别以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

    @Test
    public void test() {
        //
        final LocalDateTime now = LocalDateTime.now();
        final String format = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss,SSS"));

        log.info("now -> {}", format);
        log.debug("debug ...");
        log.info("info ...");
        log.warn("warn ...");
        log.error("error ...");
    }
}