开发者

SpringBoot集成slf4j2日志配置的实现示例

目录
  • 简介
  • 1、pom引入依赖
  • 2、剔除依赖
  • 3、创建log4j2.XML配置文件
    • 3.1、配置文件内容
    • 3.2、配置参数详解
  • 4、application.yml文件配置
    • 5、测试
      • 6、附录
        • 6.1、集成异常一
        • 6.2、 log4j2特性
        • 6.3、 log4j2异步日志的四种队列
        • 6.4 、log4j2使用了disruptor技术

      简介

      本章节主要介绍springboot项目集成slf4j2,看完本章内容可以轻松完成集成。另外说一下,在对日志输出场景比较多的情况下可以考虑将logback更换为log4j2。

      1、pom引入依赖

              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <version>1.18.24</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-log4j2</artifactId>
                  <version>3.1.0</version>
              </dependency>
      

      2、剔除依赖

      在springboot 中默认的日志管理就是logback,需要剔除原来的日志包引用,凡是相关的springboot都需要exclusion日志包,下面举例说明

      		<dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter</artifactId>
                  <version>2.7.13</version>
                  <exclusions><!-- 去掉springboot默认配置 -->
                      <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-web</artifactId>
                  <version>2.7.13</version>
                  <exclusions><!-- 去掉springboot默认配置 -->
                      <exclusion>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-starter-logging</artifactId>
                      </exclusion>
                  </exclusions>
              </dependency>
      

      3、创建log4j2.xml配置文件

      在resource目录下创建log4j2.xml文件,log4j2.xml配置详情如下:

      3.1、配置文件内容

      <?xml version="1.0" encoding="UTF-8"?>
      <!--Configuration后面的st编程客栈atus,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
      <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
      <configuration >
          <!--日志级别以及优先级排序: OFF > FATAL > ERRphpOR > WARN > INFO > DEBUG > TRACE > ALL -->
      
          <!--变量配置-->
          <Properties>
              <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
              <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
              <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
              <!-- 定义日志存储的路径 -->
              <proandroidperty name="FILE_PATH" value="E:/logss" />
              <property name="FILE_NAME" value="share" />
            
      
          </Properties>
      
          <appenders>
      
              <console name="Console" target="SYSTEM_OUT">
                  <!--输出日志的格式-->
                  <PatternLayout pattern="${LOG_PATTERN}"/>
                  <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                  <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
              </console>
      
              <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
              <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
                  <PatternLayout pattern="${LOG_PATTERN}"/>
              </File>
      
              <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
              <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
                  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                  <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
                  <PatternLayout pattern="${LOG_PATTERN}"/>
                  <Policies>
                      <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                      <TimeBasedTriggeringPolicy interval="1"/>
                      <SizeBasedTriggeringPolicy size="10MB"/>
                  </Policies>
                  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
                  <DefaultRolloverStrategy max="15"/>
              </RollingFile>
      
              <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
              <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
                  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                  <ThresholdFilthttp://www.devze.comer level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
                  <PatternLayout pattern="${LOG_PATTERN}"/>
                  <Policies>
                      <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                      <TimeBasedTriggeringPolicy interval="1"/>
                      <SizeBasedTriggeringPolicy size="10MB"/>
                  </Policies>
                  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
                  <DefaultRolloverStrategy max="15"/>
              </RollingFile>
      
              <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
              <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
                  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                  <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
                  <PatternLayout pattern="${LOG_PATTERN}"/>
                  <Policies>
                      <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                      <TimeBasedTriggeringPolicy interval="1"/>
                      <SizeBasedTriggeringPolicy size="10MB"/>
                  </Policies>
                  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
                  <DefaultRolloverStrategy max="15"/>
              </RollingFile>
      
          </appenders>
      
          <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
          <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
          <loggers>
      
              <!--过滤掉spring和myBATis的一些无用的DEBUG信息-->
              <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="Filelog"/>
                  <appender-ref ref="RollingFileInfo"/>
                  <appender-ref ref="RollingFileWarn"/>
                  <appender-ref ref="RollingFileError"/>
              </root>
          </loggers>
      
      </configuration>
      
      

      3.2、配置参数详解

      日志等级说明

      等级说明
      trace追踪,就是程序推进一下,可以写个trace输出
      debug调试,一般作为最低级别,trace基本不用
      info输出重要的信息,使用较多
      warn警告,有些信息不是错误信息,但也要给程序员一些提示。
      error错误信息。用的也很多
      fatal致命错误

      输出源

      类别说明
      CONSOLE输出到控制台
      FILE输出到文件

      格式

      类别说明
      SimpleLayout以简单的形式显示
      htmlLayout以HTML表格显示
      PatternLayout自定义形式显示

      PatternLayout自定义日志布局:

      格式说明
      %d{HH:mm:ss.SSS}表示输出到毫秒的时间
      %t输出当前线程名称
      %-5level输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
      %logger输出logger名称
      %msg日志文本
      %n换行
      %F输出所在的类文件名,如Test.Java
      %L输出行号
      %M输出所在方法名
      %l输出语句所在的行数, 包括类名、方法名、文件名、行数

      4、application.yml文件配置

      需要指定加在的配置文件,因为默认加载的文件名为log4j2-spring.xml

      logging:
        config: classpath:log4j2.xml
        level:
          root: trace
      

      5、测试

      写一段测试代码打印日志,启动项目进行测试即可

      @Slf4j
      public class Test {
      
          @GetMapping(value = "/testFeign", produces = MediaType.APPLICATION_jsON_VALUE)
          public Result<Boolean> testFeign() {
              log.info("测试feign调用------biz");
              return Result.success(true);
          }
      
      }
      

      6、附录

      6.1、集成异常一

      如果启动的时候出现如下错误,则需要

      SpringBoot集成slf4j2日志配置的实现示例

      SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.

      SLF4J: Defaulting to no-operation (NOP) logger implementation

      解决方法:引入如下依赖即可

      <!--slf4j-nop 日志开关,一旦引入依赖,所有日志实现框架将失效-->
       		<dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-nop</artifactId>
                  <version>1.7.36</version>
              </dependency>
      

      6.2、 log4j2特性

      (1)数据丢失少,可以用来做审计功能。自身内部报的exception会被发现,但是logback和log4j不会;

      (2)log4j2使用了disruptor技术,在多线程环境下,性能高于logback等10倍以上;

      (3)(garbage free)之前的版本会产生非常多的临时对象,会造成GC频繁,log4j2则在这方面上做了优化,减少产生临时对象。尽可能少的GC,其实也是基于disruptor技术;

      (4)支持lambda表达式;

      (5)对filter的功能支持的更强大;

      (6)系统日志(Syslog)协议支持TCP 和 UDP

      (7)支持kafka queue

      6.3、 log4j2异步日志的四种队列

      列出了log4j2异步日志的四种队列,有兴趣可以深入了解

      ArrayblockingQueue -- 默认的队列,通过 java 原生的 ArrayBlockingQueue 实现。
      LinkedTransferQueue -- 通过 java7 以上原生支持的 LinkedTransferQueue 实现。
      DisruptorBlockingQueue -- disruptor 包实现的高性能队列。
      JCToolsBlockingQueue -- JCTools 实现的无锁队列。
      

      6.4 、log4j2使用了disruptor技术

      Disruptor有三大杀器 CAS、消除伪共享、RingBuffer

      Disruptor通过以下设计来解决队列速度慢的问题:

      环形数组结构

      为了避免垃圾回收, 采用数组而非链表. 同时, 数组对处理器的缓存机制更加友好。

      类似的实现思想还有其他应用:

      disruptormysqllinux 内核
      RingBuffer 环形队列实现redolog通过一个环形的存储区域实现其循环写入进程间通信所使用的 fifo 通过环形存储区域
      • 元素位置定位

        数组长度2^n, 通过位运算, 加快定位的速度. 下标采取递增的形式. 不用担心index溢出的问题. index是long类型, 即使100万QPS的处理速度, 也需要30万年才能用完。

      • 无锁设计

        每个生产者或者消费者线程, 会先申请可以操作的元素在数组中的位置, 申请到之后, 直接在该位置写入或者读取数据。

      到此这篇关于SpringBoot集成slf4j2日志配置的实现示例的文章就介绍到这了,更多相关SpringBoot slf4j2日志配置内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多python多支持编程客栈(www.devze.com)! 

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜