微服務項目接入Log4j2

後臺程序開發及上線時,一般都會用到Log信息打印及Log日誌記錄,開發時通過Log信息打印可以快速的定位問題所在,幫助我們快捷開發。程序上線後如遇到Bug或錯誤,此時則需要日誌記錄來查找發現問題所在。springboot構建微服務工程可以使用很多不同的日誌系統,如logback,log4j,log4j2等,其中最常用的Apache Log4j,而Log4j 2是Log4j的升級版本,Log4j 2相對於Log4j 1.x 有了很多顯著的改善。本章內容就着重介紹微服務工程中log4j2的使用。

一.接入步驟:

1.pom引入Log4j2 Starter   disruptor依賴

<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>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.2</version>
</dependency>

2.添加log4j2.xml配置文件

      

​
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,
 你會看到log4j2內部各種詳細輸出。可以設置成OFF(關閉)或Error(只輸出錯誤信息)
-->
<Configuration status="debug">
    <Properties>
        <Property name="App">demo</Property>
        <Property name="logDir">logs</Property>
        <Property name="splitSize">30 MB</Property>
    </Properties>

    <Appenders>
        <!-- 輸出控制檯日誌的配置 -->
        <Console name="console" target="SYSTEM_OUT">
            <!--控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 輸出日誌的格式 -->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <!-- 打印出所有的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔 -->
        <RollingRandomAccessFile name="infoLog" fileName="${logDir}/${App}-info.log" immediateFlush="false"
                                 filePattern="${logDir}/$${date:yyyy-MM}/${App}-info-%d{MM-dd-yyyy}-%i.log.gz"
                                 append="true">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} [%t] %-5level %logger{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${splitSize}"/>
            </Policies>
            <Filters>
                <!-- 只記錄info和warn級別信息 -->
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!-- 指定每天的最大壓縮包個數,默認7個,超過了會覆蓋之前的 -->
            <DefaultRolloverStrategy max="50"/>
        </RollingRandomAccessFile>

        <!-- 存儲所有error信息 -->
        <RollingRandomAccessFile name="errorLog" fileName="${logDir}/${App}-error.log" immediateFlush="false"
                                 filePattern="${logDir}/$${date:yyyy-MM}/${App}-error-%d{MM-dd-yyyy}-%i.log.gz"
                                 append="false">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} [%t] %-5level %logger{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${splitSize}"/>
            </Policies>
            <Filters>
                <!-- 只記錄error級別信息 -->
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!-- 指定每天的最大壓縮包個數,默認7個,超過了會覆蓋之前的 -->
            <DefaultRolloverStrategy max="50"/>
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <AsyncLogger name="springfox" level="OFF"></AsyncLogger>
        <!-- root logger 配置,全局配置,默認所有的Logger都繼承此配置 -->
        <!-- AsyncRoot - 異步記錄日誌 - 需要LMAX Disruptor的支持 -->
        <AsyncRoot includeLocation="true">
            <AppenderRef ref="infoLog"/>
            <AppenderRef ref="errorLog"/>
            <AppenderRef ref="console"/>
        </AsyncRoot>

        </logger>

    </Loggers>
</Configuration>

​

3.添加log4j2.compomemt.properties文件,文件內容配置如下:

AsyncLogger.RingBufferSize = 10000
AsyncLoggerConfig.RingBufferSize = 10000
log4j2.AsyncQueueFullPolicy = Discard
log4j2.DiscardThreshold = DEBUG

二.log4j2的優點

1.異步模式性能優秀

2.插件化架構易擴展

3.Garbage free/Low garbage/自動降級

三.logback與log4j2的對比:

       logback的業務線程會搶佔文件句柄進行日誌輸出,而log4j2的業務線程會將日誌輸出到一個無鎖化的環形隊列中,由Log4j2線程異步讀取日誌數據然後輸出到日誌文件中,所以log4j2比logback的性能更加優秀。

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