SpringBoot集成slf4j日志和logback.xml配置详解
作者:mmseoamin日期:2023-12-11

SpringBoot集成slf4j日志和logback.xml配置详解

  • 一、Slf4j概述
  • 二、使用Slf4j打印日志
    • 1.代码方式使用Slf4j
    • 2.lombok使用注解引入@Slf4j
    • 三、项目如何配置logback.xml
      • 1. applicaiton.yml配置
      • 2. 日志级别及优先级
      • 3. logback.xml日志配置文件
      • 4. logback.xml日志配置的实现效果
      • 四、logback.xml配置文件解析
        • 1.定义日志文件的存储地址
        • 2.定义日志格式
          • 普通日志格式
          • 高亮日志格式
          • 3. 定义控制台输出
          • 4. 定义日志文件输出参数
            • 标签:appender
            • 标签:rollingPolicy
            • 标签:timeBasedFileNamingAndTriggeringPolicy
            • 5. 定义日志的输出级别
              • 标签:logger
              • 标签:root
              • 五、测试日志打印效果
                • 1. 日志打印级别的设置效果
                • 2. 日志压缩策略效果
                • 3. 日志清除策略效果

                  一、Slf4j概述

                  slf4j,即(Simple Logging Facade for Java,简单门面日志)。它是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,它只服务于各种各样的日志系统。

                  slf4j提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。

                  比如,一个项目中用到了logback,引入的类库则是使用log4j的,那么是不是要去维护两套日志框架,但是如果类库是使用SLF4J,开发的时候能够继续使用当前的日志框架,因为slf4j能够选择使用哪个实现框架,而不用维护另一套日志框架。

                  另一个特性是,SLFJ4J在日志打印的时候,使用的占位符的特性。在运行时候,占位符会被某个实际的字符串替换,从而节省新建的String对象,并且能够减少字符串的次数。

                  二、使用Slf4j打印日志

                  package com.zhou.test;
                  import lombok.extern.slf4j.Slf4j;
                  import org.slf4j.Logger;
                  import org.slf4j.LoggerFactory;
                  /**
                   * 日志测试类
                   */
                  @Slf4j
                  public class LogTest {
                      private static final Logger logger = LoggerFactory.getLogger(LogTest.class);
                      public static void logTestOut() {
                          for (int i = 0; i < 10000; i++) {
                              logger.info("org.slf4j.Logger输出");
                              log.info("lombok.extern.slf4j.Slf4j包下日志输出");
                          }
                      }
                      public static void main(String[] args) throws InterruptedException {
                          while (true) {
                              logTestOut();
                              Thread.sleep(5 * 1000);
                          }
                      }
                  }
                  

                  日志输出结果

                  2023-05-26 10:53:37.072 [main] INFO  com.zhou.test.LogTest - org.slf4j.Logger输出 
                  2023-05-26 10:53:37.074 [main] INFO  com.zhou.test.LogTest - lombok.extern.slf4j.Slf4j包下日志输出 
                  

                  1.代码方式使用Slf4j

                  SpringBoot框架内部已经集成slf4j,因此并不需要引入其他依赖,使用时需要在类中使用LoggerFactory.getLogger(类名.class)可以获取到logger对象

                   private static final Logger logger = LoggerFactory.getLogger(LogTest.class);
                  

                  2.lombok使用注解引入@Slf4j

                  使用lombok只需要引入依赖后在类上加@Slf4j注解即可直接使用

                  
                      org.projectlombok
                      lombok
                  
                  

                  三、项目如何配置logback.xml

                  1. applicaiton.yml配置

                  SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第1张

                  本测试项目的applicaiton.yml配置如下,指定了logback.xml的路径和指定目录下日志打印的级别

                  server:
                    port: 8083
                  # 日志配置
                  logging:
                    config: classpath:logback.xml
                    level:
                      com.zhou.test: info
                      org.springframework: warn
                  

                  logging.config:指定项目启动的时,读取logback.xml日志配置文件

                  logging.level:配置指定包的路径下应用程序的日志记录和日志级别。

                  2. 日志级别及优先级

                  1. trace(跟踪):一般用来追踪详细的程序运行流,比如程序的运行过程中,运行到了哪一个方法,进入了哪一条分支。通过 trace程序的运行流程,可以判断程序是否按照期望的逻辑在运行
                  2. debug(调试 ):这类日志往往用在判断是否有出现bug的场景,且往往记录了代码运行的详细信息,比如方法调用传入的参数信息
                  3. info(消息):用来记录程序运行的一些关键信息,它不像trace那样记录程序运行的整个流程,也不像debug那样为了解决问题而记录详细的信息。info记录的是整个系统的运行信息,比如系统运行到了哪一个阶段,到达了哪一个状态
                  4. warn(警告):用来记录一些警告信息。警告信息表示,程序进入了一个特殊的状态,在该状态下程序可以继续运行,但是不建议让程序进入该状态,因为该状态可能导致结果出现问题
                  5. error(错误):用来记录运行时的错误信息,表示程序运行过程中出现了需要被解决的问题,往往是一些异常。使用error日志的时候,一般会将详细的异常出现的原因记录

                  日志优先级从高到低依次为trace、debug、info、warn、error。相对而言,打印的日志会越来越少。

                  3. logback.xml日志配置文件

                  
                  
                      
                      
                      
                      
                      
                      
                      
                      
                      
                      
                          
                              ${HIGHLIGHT_PATTERN}
                          
                      
                      
                      
                          
                          false
                          
                          ${LOG_HOME}/info.log
                          
                              
                              ${LOG_HOME}/info-%d{yyyy-MM-dd}_%i.log.zip
                              
                              7
                              
                              10GB
                              
                                  
                                  100MB
                              
                          
                          
                          
                              
                              %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
                          
                      
                      
                      
                      
                      
                          
                          
                      
                  
                  

                  4. logback.xml日志配置的实现效果

                  以下配置生成了日志文件info.log,如果超过了最大设置100MB,则日志文件会被压缩和切割。如果日志文件总大小超过了10GB,超过该日志总量的最早的日志压缩包会被清除

                  
                   ${LOG_HOME}/info.log
                  

                  SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第2张

                  四、logback.xml配置文件解析

                  1.定义日志文件的存储地址

                    
                      
                      
                      
                  
                  namevalue作用
                  APP_NAMElog-test定义当前项目的名称
                  LOG_HOME/logs/${APP_NAME}定义日志的路径,${APP_NAME}:表示引用上面定义的项目名,最后生成路径为:/logs/log-test/…

                  2.定义日志格式

                  普通日志格式

                      
                      
                  

                  name="LOG_PATTERN"表示定义日志格式名称

                  参数含义
                  %d表示日期(也可以使用"%date")
                  %-5level表示级别从左显示5个字符宽度
                  %thread表示线程名称
                  %-30.30logger{30}表示如果logger的名称小于30,就“-”指定左对齐;如果其名称长于30字符,就从左边较远输出的字符截掉,保持logger的名字长度最终限制为30个字符
                  %msg表示日志消息
                  %n表示换行符

                  效果如下:

                  2023-05-26 15:19:28.337 [INFO ] [main] [om.zhou.test.LogTest] Info级别的日志输出
                  2023-05-26 15:19:28.339 [ERROR] [main] [om.zhou.test.LogTest] Error级别的日志输出
                  

                  高亮日志格式

                     
                      
                  

                  name="HIGHLIGHT_PATTERN"表示定义日志格式名称

                  参数含义
                  %yellow()%green(%highlight()颜色高亮
                  %d表示日期(也可以使用"%date")
                  %-5level表示级别从左显示5个字符宽度
                  %thread表示线程名称
                  %-30.30logger{30}表示如果logger的名称小于30,就“-”指定左对齐;如果其名称长于30字符,就从左边较远输出的字符截掉,保持logger的名字长度最终限制为30个字符
                  %msg表示日志消息
                  %n表示换行符

                  效果如下:

                  SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第3张

                  3. 定义控制台输出

                  
                   
                       
                           ${HIGHLIGHT_PATTERN}
                       
                   
                  
                  标签含义
                  appender负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名
                  encoder对日志进行格式化
                  pattern用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“%”进行转义

                  以上语句通过引用${HIGHLIGHT_PATTERN},使得输出到控制台的格式为高亮日志格式

                  SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第4张

                  4. 定义日志文件输出参数

                  
                  
                     
                     false
                     
                     ${LOG_HOME}/info.log
                     
                         
                         ${LOG_HOME}/info-%d{yyyy-MM-dd}_%i.log.zip
                         
                         7
                         
                         10GB
                         
                             
                             100MB
                         
                     
                     
                     
                         
                         %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
                     
                     
                  
                  

                  标签:appender

                  定义一个名为 “FILE” 的文件参数配置,指定appender属性class定义具体的滚动策略类prism language-xml"> 100MB

                  5. 定义日志的输出级别

                  
                   
                   
                   
                       
                       
                   
                  

                  标签:logger

                  仅有一个name属性,一个可选的level和一个可选的additivity属性

                  • 属性name: 用来指定受此logger约束的某一个包或者具体的某一个类
                  • 属性level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别
                  • 属性additivity: 是否向上级logger传递打印信息。默认是true。同一样,可以包含零个或多个元素,标识这个appender将会添加到这个logger

                    标签:root

                    root也是logger元素,但是它是根loger并且只有一个level属性,可以包含零个或多个元素,标识这个appender将会添加到这个loger

                    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG

                    五、测试日志打印效果

                    1. 日志打印级别的设置效果

                    设置root节点的level=“trace”,效果如下:

                    SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第5张

                    设置root节点的level=“error”,效果如下:

                    SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第6张

                    2. 日志压缩策略效果

                    SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第7张

                    3. 日志清除策略效果

                    设置压缩包大小超过10MB后自动清理

                    SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第8张

                    当前压缩包共占用9.77MB,当超过10MB时,日志文件名中‘_0’的日志包被删除

                    SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第9张

                    SpringBoot集成slf4j日志和logback.xml配置详解,在这里插入图片描述,第10张