美文网首页
SpringBoot-集成Log4j2

SpringBoot-集成Log4j2

作者: 张明学 | 来源:发表于2020-04-12 13:33 被阅读0次

背景


​ 工作过程中一般我们都是接手的项目,可能只注意到怎么使用log4j,没有亲手设置过项目的log4j。本人也是,出于学习的目地,自己亲手试着在SpringBoot的项目中集成了一下log4j2。之于为什么要集成log4j2,本人网上也查了下,主要是:性能提升、自动重载配置

集成


Jar依赖

​ SpringBoot默认集成的日志系统是LogBack,logBack是随着spring-boot-starter-logging引进来的,如图:


image-20200412111852041.png

当然SpringBoot也是支持Log4j2,只需要去掉logback的依赖,引入Log4j2即可。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 去掉SpingBoot默认的日志系统:LogBack,集成在spring-boot-starter-logging -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
</dependency>
<!-- 引入Log4j2,它集成中spring-boot-starter-log4j2 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

如果你需要用到Log4j2的AsyncLogger的异步日志实现方式,还需要引入Disruptor

<!-- log4j2异步打印所需-->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.2</version>
</dependency>

异常说明 如果你的LogBack没有排干净(即被别的系统间接的引入了LogBack的jar),系统会报错,报错信息是很奇怪的

Logging system failed to initialize using configuration from 'classpath:-----.xml'

异常信息是:

ERROR in ch.qos.logback.core.joran.spi.Interpreter@109:47 - no applicable action for [AppenderRef], current ElementPath  is [[configuration][Loggers][AsyncRoot][AppenderRef]]
    at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
配置文件

​ log4j2一般采用的是xml形式的配置,你需要在在resources目录下新建一个log4j2的配置文件,暂时名称为log4j2.xml。另外还需要在application.properties文件中显示声明才行

logging.config=classpath:log4j2.xml

​ 当然如果不配置logging.config,SpringBoot默认加载的文件名是:log4j2.xml、log4j2-file.xml这两个,在源码:org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.loadDefaults中:

protected void loadDefaults(LoggingInitializationContext initializationContext,
      LogFile logFile) {
   if (logFile != null) {
      loadConfiguration(getPackagedConfigFile("log4j2-file.xml"), logFile);
   }
   else {
      loadConfiguration(getPackagedConfigFile("log4j2.xml"), logFile);
   }
}

​ 到此SpringBoot集成Log4j2的工作已经完成,可能很多同学跟我一样,也想了解一下log4j2的配置,下面来介绍一下log4j2的日志配置。

Log4j2.xml配置说明

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--status="WARN": status用来指定log4j本身的打印日志的级别.默认是OFF -->
<!--monitorInterval="30": 间隔秒数,自动检测配置文件的变更和重新配置本身(如果跟踪线上异常信息可以把配置文件修改后不需重启服务,日志就会按照新的配置输出) -->
<configuration status="INFO" monitorInterval="30">

    <properties>
        <!--自定义一些常量,之后使用${变量名}引用-->
        <!-- 配置日志文件输出目录 -->
        <Property name="log_dir">/data/logs/app</Property>
    </properties>

    <!--Appenders: 定义输出内容,输出格式,输出方式,日志保存策略等,常用其下三种标签[console,File,RollingFile]-->
    <Appenders>

        <!--Console :控制台输出的配置-->
        <Console name="CONSOLE" target="SYSTEM_OUT" follow="true">
            <!-- %d 当前时间 -->
            <!-- %level 日志级别 -5表示占5个字符并且左对齐 -->
            <!-- %t或%thread 线程名 -->
            <!-- %c logger名称,由LoggerFactory.getLogger()方法传入 -->
            <!-- %L 输出错误行号 -->
            <!-- %M或%method 输出方法名 -->
            <!-- %n换行符 -->

            <!-- %l (小写l字母)输出日志事件发生位置,包括类目名、在代码中的行数 -->
            <!-- %m或%msg或%message 输出信息logger.error(String msg)、logger.info(“message”)等转入的message -->
            <!-- %C或%class 输出类名 -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS}|%-5level|%thread|%c-%L| - %msg%n"/>
        </Console>

        <Console name="CONSOLE2" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS}|%-5level|%C-%m| - %msg%n"/>
        </Console>

        <!--普通地输出到本地文件-->
        <!--append="false" :根据其下日志策略,每次清空文件重新输入日志,可用于测试-->
        <File name="logFile" fileName="${log_dir}/logFile.out" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender,对日志文件进行封存,对日志滚动存档 -->
        <RollingFile name="ROLLING_FILE" fileName="${log_dir}/catalina.out"
                     filePattern="${log_dir}/catalina.%d{yyyy-MM-dd}.log.gz"
                     immediateFlush="false">
            <Filters>
                <!--控制台只输出level及以上级别的信息(onMatch)Match:匹配 DENY:拒绝 Mismatch:不匹配 ACCEPT:接受 -->
                <ThresholdFilter level="INFO" onMatch="ACCEPT"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS}|%-5level|%thread|%X{invokeNo}|%c-%L| - %msg%n"/>

            <!-- Policies :日志滚动存档的策略-->
            <Policies>
                <!-- TimeBasedTriggeringPolicy :时间滚动策略,默认0点小时产生新的文件,interval="1":自定义文件滚动时间间隔,1的单位以filePattern的时间为单位,本例为1天,如果filePattern的时间参数精确到-H,则以小时为单位 -->
                <!-- modulate若为true,则日志时间将以0点为边界进行偏移计算; 每间隔interval(与filepattern滚动日期单位一致)发生一次rollover,得到一个log.tar.gz文件-->
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
                <!-- 日志文件达到多少的时候进行滚动 -->
                <!--<SizeBasedTriggeringPolicy size="100 MB"/>-->
            </Policies>
            <!-- 最多同一文件夹下7个日志压缩文件,默认7个-->
            <DefaultRolloverStrategy min="1" max="7"/>
        </RollingFile>

    </Appenders>

    <Loggers>

        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <!--Logger节点用来单独指定日志的形式,name为包路径,比如要为org.springframework包下所有日志指定为INFO级别等。 -->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
                
        <!--<root level="ALL">-->
        <!--<AppenderRef ref="CONSOLE" />-->
        <!--</root>-->

        <AsyncRoot level="INFO" includeLocation="true">
            <AppenderRef ref="CONSOLE"/>
            <AppenderRef ref="ROLLING_FILE" />
        </AsyncRoot>

        <!--additivity="false": additivity设置事件是否也在root的logger输出,true为重复输出(本例如果配置成true则表示zmx.test包及其子包的日志在CONSOLE2输出,也在CONSOLE和ROLLING_FILE中输出),一般配置成false-->
        <!--includeLocation="true": 表示是否输出位置信息,如果配置成false,无论是否配置%c %L %l 都无效,只会输出message -->
        <AsyncLogger name="zmx.test" level="INFO" additivity="false" includeLocation="true">
            <AppenderRef ref="CONSOLE2"/>
            <AppenderRef ref="logFile"/>
        </AsyncLogger>

    </Loggers>

</configuration>

异步日志


常用的:root为同步日志输出,AsyncLogger为异步日志。异步日志输出注意三点:

  • 不要同时使用AsyncAppender和AsyncLogger,也就是在配置中不要在配置Appender的时候,使用Async标识的同时,又配置AsyncLogger,这不会报错,但是对于性能提升没有任何好处。

    AsyncAppender是利用java.util.concurrent.ArrayBlockingQueue实现而不需要其它外部的类库

    AsyncLogger是利用Disruptor库实现的,这就是为什么上面需要引用Disruptor的原因。

    尽可能的用:AsyncLogger

  • 不要在开启了全局同步的情况下,仍然使用AsyncAppender和AsyncLogger。这和上一条是同一个意思,也就是说,如果使用异步日志,AsyncAppender、AsyncLogger和全局日志,不要同时出现。

    全居配置有两种方式:

    1、在系统初始化的时候,增加全局参数配置

    System.setProperty("log4j2.contextSelector,"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
    

    2、你可以在你第一次获取Logger之前设置,也可以加载JVM启动参数里,类似

    java -Dog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    
  • 如果不是十分必须,不管是同步异步,都设置immediateFlush为false,这会对性能提升有很大帮助。

以上内容有参考:
专门分析了Log4j2的异步日志 https://www.jianshu.com/p/9f0c67facbe2
对log4j2的配置做了详细说明 https://www.jianshu.com/p/d13c2e50a89c

相关文章

  • SpringBoot-集成Log4j2

    背景 ​ 工作过程中一般我们都是接手的项目,可能只注意到怎么使用log4j,没有亲手设置过项目的log...

  • 目录

    集成log4j2

  • Skywalking之五整合

    个人专题目录 Skywalking项目集成 相关Maven依赖引入 traceId 集成到日志组件Log4j2,t...

  • SpringBoot-集成Mybatis

    SpringBoot集成Mybatis 在 Spring+SpringMVC 中整合 MyBatis 步骤还是有点...

  • SpringBoot-集成redis

    概述 本文讲述SpringBoot如何集成Redis 添加Redis依赖 在application.propert...

  • Springboot-集成Spring Cache

    首先,我们要注意,只有使用public定义的方法或者类,可以被Spring Cache缓存。 当在一个类上使用注解...

  • SpringBoot集成Log4j2框架

    1.说明 本文详细介绍Spring Boot集成Log4j2框架的方法,基于已经创建好的Spring Boot工程...

  • springboot常用starter③-log4j2

    还没引入之前日志 修改后 集成log4j2过程 引入 spring-boot-starter-log4j2 直接启...

  • Springboot-使用 Mybatis 集成 pagehel

    转载自 https://www.javazhiyin.com/33686.html 前言 在 Springboot...

  • 日志

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案https://www.cnblogs.com/haf...

网友评论

      本文标题:SpringBoot-集成Log4j2

      本文链接:https://www.haomeiwen.com/subject/fervmhtx.html