SpringBoot+log4j2實現標準日誌記錄

前言

此篇文章基於xml文件形式進行整合,後續會另推出以boot/cloud爲微服務架構下基於log4j2整合

說到log4j2肯定會有log4j,log4j2就是log4j的替代者,log4j目前已經停止更新,微服務架構下日誌首選爲ELK,然而ELK略耗資源,由此很多企業都採用logBack或者log4j2+slf4j,

核心依賴添加

SpringBoot默認攜帶自身的log日誌功能,需要去調默認配置方能生效

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

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

log4j2核心配置(基於xml形式)

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個字符
        %date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %l - %msg%n
        -->
        <property name="LOG_PATTERN" value="%date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %l -%M - %msg%n"/>
        <!-- 定義日誌存儲的路徑 -->
        <property name="FILE_PATH" value="D:\logs"/>
    </Properties>

    <appenders>
        <!--控制檯日誌輸出-->
        <console name="Console" target="SYSTEM_OUT">
            <!--運行日誌輸入文件-->
            <!--<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <!--日誌的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--控制檯只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <!--控制檯輸出日誌格式-->
            <!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
        </console>
        <AsyncRoot level="info" includeLocation="true">
            <AppenderRef ref="Console"/>
            <appender-ref ref="infoJournal"/>
            <appender-ref ref="debugJournal"/>
        </AsyncRoot>
        <!--
        debug 運行時異常日誌信息
        -->
        <RollingFile name="debugJournal" fileName="${FILE_PATH}/堆棧日誌.log"
                     filePattern="D://logs/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
            <!--文件只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--日誌消息輸出格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--日誌拆分規則-->
            <Policies>
                <!--在系統啓動時,生成一個新的日誌文件-->
                <OnStartupTriggeringPolicy/>
                <!--interval屬性用來指定多久滾動一次,默認是1 hour-->
                <TimeBasedTriggeringPolicy interval="0.001"/>
                <SizeBasedTriggeringPolicy size="10 Kb"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下10個文件開始覆蓋-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
        <RollingFile name="infoJournal" fileName="${FILE_PATH}/運行日誌.log"
                     filePattern="D://logs/$${date:yyyy-MM-dd}/run-%d{yyyy-MM-dd}-%i.log">
            <!--文件只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--日誌消息輸出格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--日誌拆分規則-->
            <Policies>
                <!--在系統啓動時,生成一個新的日誌文件-->
                <OnStartupTriggeringPolicy/>
                <!--interval屬性用來指定多久滾動一次,默認是1 hour-->
                <TimeBasedTriggeringPolicy interval="0.001"/>
                <SizeBasedTriggeringPolicy size="10 KB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下10個文件開始覆蓋-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
    </appenders>

    <!--Logger節點用來單獨指定日誌的形式,比如要爲指定包下的class指定不同的日誌級別等。-->
    <!--然後定義loggers,只有定義了logger並引入的appender,appender纔會生效-->
    <loggers>

        <!--過濾掉spring和mybatis的一些無用的信息-->
        <logger name="org.mybatis" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </logger>
        <!--監控系統信息-->
        <!--若是additivity設爲false,則 子Logger 只會在自己的appender裏輸出,而不會在 父Logger 的appender裏輸出。-->
        <Logger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="infoJournal"/>
            <appender-ref ref="debugJournal"/>
        </root>
    </loggers>
</configuration>

引用log4j2日誌規則文件

SpringBoot下有yml簡化寫法和properties全名寫法
我用的是yml,由此是下面這種格式,你們用時直接修改配置文件爲application.yml爲後綴即可

logging:
  config: classpath:log4j2-spring.xml

controller層引用log4j2

這裏簡單描述一下當前測試場景,根據我的配置文件loh4j2-spring.xml日誌規則,我這裏只記錄兩種級別,一個爲運行日誌(包含錯誤信息,程序運行過程),一個爲訪問日誌(只記錄運行信息)

package com.itxwl.run.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Auther: 薛
 * @Date: 2020/4/30 15:37
 * @Description:
 */
@RestController
@RequestMapping("t")
public class DemoController {
    private Logger logger= LogManager.getLogger(DemoController.class);
    @GetMapping("/s/{data}")
    public Integer  s(@PathVariable("data") Integer data){
        logger.fatal("訪問運算接口~");
        Integer dd=5;
        Integer ix=0;
        if (!StringUtils.isEmpty(data)){
            try {
                ix = dd / data;
            } catch (Exception e) {
                logger.error("運算失敗,可能被除數爲零");
            }
        }
        return ix;
    }
}

服務運行後場景概況

根據以上log4j2配置文件規則會在系統D盤/logs文件下生成日誌文件

  • 首次系統運行即生成兩個文件
    在這裏插入圖片描述
  • 日誌測試環境限定配置爲滿10KB即滾動當前日誌文件,異常及堆棧信息移動其它文件

  • 日誌文件滿足10KB時會自動新增,根據xml文件配置如果滿30個文件,會回滾爲最後一條爲最新數據

在這裏插入圖片描述

服務結構圖(基於idea)

在這裏插入圖片描述

日誌記錄文件圖示

  1. 運行日誌如圖

  2. 訪問日誌如圖
    在這裏插入圖片描述

結束語(博主聯繫方式)

當然只是基礎引用log4j2記錄日誌,後續會持續推出日誌相關文章,進而整合到微服務架構下日誌記錄。

QQ:2509647976
微信:x331191249

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章