zoukankan      html  css  js  c++  java
  • Springcloud学习笔记38springboot整合日志框架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

  • 相关阅读:
    黑客无处不在
    微博对我的影响
    WPF Chart DynamicDataDisplay的横坐标显示日期的解决方案
    java虚拟机中的字节码
    python解释器的使用
    Python学习环境设置
    变量的概念
    创建虚拟环境和常用包
    第三章笔记
    第一章笔记
  • 原文地址:https://www.cnblogs.com/luckyplj/p/15625761.html
Copyright © 2011-2022 走看看