1. 程式人生 > 其它 >Springboot 整合log4j2配置

Springboot 整合log4j2配置

1. 引入log4j2依賴:

注意點:

(1). springboot預設是logback日誌框架, 需要先排除spring-boot-starter-logging包, 否則會引起jar包衝突

(2). 如果要配置log4j2非同步日誌, 需要新增disruptor依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId
> <!--springboot預設是logback日誌框架, 需先排除此依賴, 否則會和log4j2產生jar包衝突--> <!--但是這種排除方式不一定有效,因為可能別的依賴包裡也集成了預設的日誌,這樣的話專案啟動依舊會報衝突--> <!--<exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions>
--> </dependency> <!-- 全域性排除spring-boot-starter-logging相關所有依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <exclusions> <
exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入log4j2依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- 使用log4j2的Async配置需要引入disruptor包 --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> </dependency>

2. applicaton.yml配置:

指定log4j2.xml配置檔案位置, 這裡通過指定不同檔案來區分不同的環境(開發,測試,生產)

logging:
  config: classpath:log4j2.xml

3. log4j2.xml詳細配置:

以下為同步日誌配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!--Configuration後面的status,這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置檔案和重新配置本身(無需重啟,熱更新),設定間隔秒數-->
<Configuration status="WARN" monitorInterval="1800">
    <!--日誌級別以及優先順序排序: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->

    <!--變數配置-->
    <Properties>
        <!--應用名稱-->
        <property name="APP_NAME">sky-hello</property>
        <!--日誌存放路徑-->
        <property name="LOG_PATH">./logs/${APP_NAME}</property>
        <!--日誌備份路徑-->
        <property name="LOG_BACKUP_PATH">${LOG_PATH}/backup</property>
        <!--日誌輸出格式-控制檯-->
        <property name="PATTERN_CONSOLE">%d{yyyy-MM-dd HH:mm:ss.SSS} | %blue{%traceId} | %highlight{%-5p} | %magenta{${sys:PID}} | %yellow{%t} | %cyan{%l} : %msg%n</property>
        <!--日誌輸出格式-檔案-->
        <property name="PATTERN_FILE">%d{yyyy-MM-dd HH:mm:ss.SSS} | %traceId | %-5p | ${sys:PID} | %t | %l : %msg%n</property>
    </Properties>

    <!--定義日誌輸出目的地,內容和格式等-->
    <Appenders>
        <!--控制檯-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--輸出日誌的格式:
                1.不設定預設為: %m%n
                2.disableAnsi="false" noConsoleNoAnsi="false" 配置開啟支援%highlight彩色日誌
            -->
            <PatternLayout pattern="${PATTERN_CONSOLE}" disableAnsi="false" noConsoleNoAnsi="false"/>
            <!--只輸出level及其以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>

        <!--可歸檔檔案
            1. fileName: 日誌儲存路徑
            2. filePattern: 歷史日誌封存路徑。其中%d{yyyy-MM-dd}表示了日誌的時間單位是天,log4j2自動識別zip等字尾,表示歷史日誌需要壓縮
        -->
        <RollingFile name="RollingFile" fileName="${LOG_PATH}/${APP_NAME}.log" filePattern="${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-%d{yyyy-MM-dd}_%i.log.zip">
            <!--輸出日誌的格式, 不設定預設為:%m%n-->
            <PatternLayout pattern="${PATTERN_FILE}"/>
            <!--只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--歸檔設定-->
            <Policies>
                <!--按時間間隔歸檔:
                    1. interval=時間間隔, 單位由filePattern的%d日期格式指定, 此處配置代表每一天歸檔一次
                    2. modulate="true" 是否對interval取模,決定了下一次觸發的時間點
                -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!-- 按照日誌檔案的大小: size表示當前日誌檔案的最大size,支援單位:KB/MB/GB-->
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <!-- 歷史日誌配置: 該屬性如不設定,則預設為最多同一資料夾下7個檔案開始覆蓋-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

        <!--錯誤資訊單獨歸檔-->
        <RollingFile name="RollingFileError" fileName="${LOG_PATH}/${APP_NAME}-error.log" filePattern="${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-error-%d{yyyy-MM-dd}_%i.log.zip">
            <PatternLayout pattern="${PATTERN_FILE}"/>
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
        </RollingFile>
    </Appenders>


    <!--Loggers配置-->
    <Loggers>

        <!--
        注意點:
        1. logger節點用來單獨指定日誌的形式,比如要為指定包下的class指定不同的日誌級別等:
           (1). name: 用來指定該logger所適用的類或者類所在的包全路徑,繼承自Root節點.
           (2). AppenderRef:關聯的Appender, 只有定義了logger並引入的appender,appender才會生效
           (3). additivity: logEvent的傳遞性。true LogEvent處理後傳遞給父Logger列印。false LogEvent處理後不再向上傳遞給父Logger(解決日誌重複輸出問題)
           (4). logger配置的level必須高於或等於Appenders中ThresholdFilter配置的過濾level, 否則會造成資訊丟失
        2. root配置日誌的根節點
        -->

        <!-- 同步日誌配置-->
        <logger name="com.sky.hello.mapper" level="debug" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="RollingFileError"/>
        </logger>

        <root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="RollingFileError"/>
        </root>

    </Loggers>

</Configuration>

4. log4j2非同步配置

小夥伴看到這裡可能要問: 作為log4j2最炸裂的賣點(號稱效能翻倍)的非同步日誌呢? 咋配置呢?

哈哈,不要急,這裡樓主整理了2種配置方式:

(1).  全域性配置非同步

①. 修改引數:

JVM引數方式:
JVM啟動引數(boot.ini)加上“-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector”
System引數方式
@SpringBootApplication
public class SkyHelloApplication {

    public static void main(String[] args) {
        /**
         *  log4j2非同步日誌全域性配置,減小輸出日誌對效能的影響:
         *  此配置會導致log日誌不輸出logger相關資訊, 故在這裡不做全域性配置
         */
        System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

        SpringApplication.run(SkyHelloApplication.class, args);
    }
}

上述兩種修改引數方式, 任選一種即可

②.  修改log4j2.xml配置中的Loggers節點如下:

增加 includeLocation="true" 屬性, 否則日誌不會輸出%l相關詳細資訊

    <Loggers>
        <logger name="com.sky.hello.mapper" level="debug" additivity="false" includeLocation="true">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="RollingFileError"/>
        </logger>

        <root level="info" includeLocation="true">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="RollingFileError"/>
        </root>
    </Loggers>

(2). 指定區域性Logger節點配置非同步

log4j2.xml配置檔案中使用AsyncRoot/AsyncLogger替代Root/Logger

    <Loggers>
        <!-- 非同步日誌配置:
             includeLocation: true表示輸出logger相關行號資訊
        -->
        <AsyncLogger name="com.sky.hello.mapper" level="debug" additivity="false" includeLocation="true">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="RollingFileError"/>
        </AsyncLogger>

        <AsyncRoot level="info" includeLocation="true">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile" />
            <AppenderRef ref="RollingFileError"/>
        </AsyncRoot>
    </Loggers>

上述2種方式任選其一即可,不要同時採用

如果非同步日誌配置成功, 程式啟動後, 可在idea中檢視到log4j2生成的非同步日誌輸出執行緒:

5. 程式碼測試:

這裡模擬一個啟動類做一些日誌輸出

@Component
public class StartHandler implements ApplicationRunner {

    private static final Logger LOG = LoggerFactory.getLogger(StartHandler.class);

    @Resource
    private HelloMapper helloMapper;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        helloMapper.selectList(null);
        LOG.debug("我是 debug...");
        LOG.info("我是 info...");
        LOG.warn("我是 warn...");
        LOG.error("我是 error...");
    }
}

控制檯輸出: