Springcloud學習筆記38--springboot整合日志框架log4j2


1.log4j2概述

常用的日志框架:

  • Log4j:Apache的一個開源項目,可以控制日志信息輸送的目的地是控制台、文件、GUI組件等,可以控制每一條日志的輸出格式,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。雖然已經停止維護了,但目前絕大部分企業都是用的log4j。
  • LogBack:是Log4j的一個改良版本
  • Log4j2:Log4j2已經不僅僅是Log4j的一個升級版本了,它從頭到尾都被重寫了

log4j2 在目前JAVA中的日志框架里,異步日志的性能是最高的,沒有之一。

2. log4j2的日志引入

springboot 項目結構:

 首先引入依賴,然后添加日子的配置文件,最后將配置文件引入到yml文件中生效。后就可以在項目中使用lombok的插件直接在類上注解即可使用。

2.1 pom.xml中引入依賴

web依賴中排除掉logging依賴,並且引入log4j2依賴。不只是starter-web中有logging jar包,如redis,mybatis中也有這個jar包,需要將他們也清除,否則依然會報錯!

        <!--Lombok能通過注解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.6.RELEASE</version>
            <!--排除掉logging,不使用logback,改用log4j2-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

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

         <!--log4j2依賴disruptor-->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.2</version>
        </dependency>

2.2 log4j2.xml配置文件

部分參數說明:

(1)%c

 

 (2)%d

(3)%m

%m表示輸出所有message消息

(4)%n

%n 為換行符

 (5)%t

(6)%L

配置文件案例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" monitorInterval="600">
    <Properties>
        <property name="LOG_HOME" value="${sys:user.home}/logs"/>
        <property name="APP_CODE" value="file_log"/>
        <property name="LOG_LEVEL_PATTERN" value="%-5p"/>
        <property name="INSTANCE_INFO_PATTERN" value="${homeName}:${sys:user.name}"/>
        <property name="CODE_INFO_PATTERN" value="%pid:%F:%L"/>
        <property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
        <property name="METRIC_LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
        <property name="APP_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}}  | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID} | %t | ${CODE_INFO_PATTERN} | [%X{seq}] -%m%n"/>
        <property name="METRIC_LOG_PATTERN" value="%d{${METRIC_LOG_DATEFORMAT_PATTERN}}%m%n"/>
        <property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | %X{TRACE_ID}  | ${LOG_LEVEL_PATTERN} | ${INSTANCE_INFO_PATTERN} | ${CODE_INFO_PATTERN} | [%X{seq}] -%m%n"/>
        <property name="ALERT_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}}  $${ctx:traceId:-}  | ${INSTANCE_INFO_PATTERN} |  [%X{seq}] -%m%n"/>
    </Properties>
    <!--先定義所有的appender-->
    <appenders>
        <!--這個輸出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT" follow="true">
            <!--輸出日志的格式,-->
            <PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN}} |  ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] -%m%n"/>
        </console>

        <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔-->
        <RollingFile name="EventLogFile" fileName="${LOG_HOME}/event.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy internal="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <!--保留最近30天的日志-->
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <IfFileName glob="*/app.log.*"/>
                    <IfLastModified age="30d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="AppLogFile" fileName="${LOG_HOME}/app.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i">
            <PatternLayout>
                <Pattern>${APP_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy internal="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <!--保留最近30天的日志-->
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <IfFileName glob="*/app.log.*"/>
                    <IfLastModified age="30d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="AlertLogFile" fileName="${LOG_HOME}/alert.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i">
            <PatternLayout>
                <Pattern>${ALERT_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy internal="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="ErrorLogFile" fileName="${LOG_HOME}/error.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy internal="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>

        </RollingFile>


        <RollingFile name="FlepMetricLogFile" fileName="${LOG_HOME}/metric.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/metric.log.%i">
            <PatternLayout>
                <Pattern>${METRIC_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy internal="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
        </RollingFile>

    </appenders>
    <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效-->
    <loggers>
        <Root level="INFO">
            <AppenderRef ref="Console" />
            <AppenderRef ref="AppLogFile" />
            <AppenderRef ref="AlertLogFile"/>
            <AppenderRef ref="ErrorLogFile"/>
        </Root>
        <AsyncLogger name="event" level="ALL" additivity="false">
            <AppenderRef ref="EventLogFile"/>
        </AsyncLogger>


        <logger name="org.apache" level="warn"/>
        <logger name="org.springframework" level="warn"/>
        <logger name="com.netflix" level="warn"/>
        <logger name="springfox" level="warn"/>

    </loggers>
</configuration>

下面針對配置文件進行圖文說明:

 注意:user.home的屬性值可以用以下方法查看,本機默認為C:\Users\14032

    public static void main(String[] args) {
        System.out.println(System.getProperty("user.home"));
    }

 2.3 在application.yml文件中引入配置文件,正式生效日志的配置

logging:
  config: classpath:log4j2-dev.xml

2.4 在項目中使用log4j2 DEMO

如果不想每次都寫private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j,這個注解需要引入lombok的jar包依賴。已添加到pom中

 

 

參考文獻:

https://zhanglf.blog.csdn.net/article/details/88909106

https://blog.csdn.net/u010663021/article/details/108388817

https://www.jianshu.com/p/d13c2e50a89c


免責聲明!

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



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