1.SpringBoot中的日志实现原理

1.1.在SpringBoot中日志由接口+实现组成的

日志接口 日志实现
JCL(Jakarta Commons Logging)
SLF4J(Simple Logging Facade for Java)
jboss-logging
Log4j
JUL(java.util.logging)
Log4j2
Logback

​ **SpringBoot默认使用了slf4j+logback组合作为默认底层日志。**SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件。

1.2.SpringBoot是如何进行默认配置的

  • 每个starter场景,都会导入一个核心场景spring-boot-starter
  • 核心场景引入了日志的所用功能spring-boot-starter-logging,默认使用了slf4j+logback组合作为默认底层日志
  • 不同与其他组件,日志是系统一启动就要使用,所以日志是利用监听器机制ApplicationListener配置好的;而xxxAutoConfiguration是系统启动后加载的组件,是准备以后用的。
  • 日志所有的配置都可以通过修改配置文件实现,以logging开始的所有配置。

2.SpringBoot日志系统配置

2.1.日志级别

  • 由低到高: ALL,TRACE, DEBUG, INFO, WARN, ERROR,FATAL,OFF只会打印指定级别及以上级别的日志

  • SpringBoot日志默认级别是 INFO,常用DEBUG、INFO、WARN、ERROR

    日志级别 说明
    ALL 打印所有日志
    TRACE 最详细的日志,通常用于诊断问题和追踪代码执行流程,一般不用
    DEBUG 开发调试日志
    INFO 关键信息日志,通常用于向用户展示可读的操作结果或执行状态
    WARN 警告信息日志,比如:系统资源紧张时,可以记录一条WARN级别的日志
    ERROR 业务错误日志,比如出现各种异常
    FATAL 致命错误日志,比如jvm系统崩溃**【注意:logback 没有FATAL级别,对应的是ERROR】**
    OFF 关闭所有日志记录
  • application.yml配置

    #1.开启所有类(默认root组)的日志级别为info
    #2.单独指定LogController类日志级别为error
    #3.分组指定web组日志级别为warn,指定sql组日志级别为debug
    logging:
      level:
        '[com.leo.demo.controller.LogController]': error
        web: warn
        sql: debug
        root: info
      #组别
      group: 
        web: org.springframework.web,org.springframework.core.codec
        sql: org.springframework.jdbc.core,org.hibernate.SQL
    

2.2.日志格式

  • 经典格式

    %d{yyyy-MM-dd HH:mm:ss.SSS} %clr(${PID:- }){cyan}--%-5level [%thread] %-40.40logger{40} == => %m%n

    格式化字符 含义
    %d{yyyy-MM-dd HH:mm:ss.SSS} 时间和日期:毫秒级精度
    ${PID:- } 进程号
    %-5level 日志级别,左对齐,宽度为5个字符
    %thread 线程名
    %logger{40} 通常为产生日志的类名,宽度为40,超出截取
    %m 日志记录的内容
    %n 换行符
    %clr(日志内容){颜色} 添加颜色,faint灰白色、cyan青色、green、red、yellow、blue
    %-40.40 若长度小于40,则右边用空格填充;超过40,则截去多余字符

    [!NOTE]

    %clr(字符串){颜色}

    (1)如果在SpringBootApplication.yml中配置,还需要开启spring.output.ansi.enabled=always强制颜色输出,否则控制台输出时,颜色不生效(在日志文件中使用彩色日志会导致乱码问题,影响日志的查看和分析。因此,建议仅在控制台输出时使用彩色日志)。

    ​ 或者配置中直接使用颜色名称,如%red(日志内容)

    (2)如果是自定义日志配置文件,引入颜色转换器ColorConverter即可

  • application.yml配置

    #设置控制台日志输出格式
    logging:
      pattern:
        console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(${PID:- }){green} %red(--) %-5level [%thread] %-30.30logger{30}==>%m%n"
    #强制彩色输出,使%clr生效
    spring:
      output:
        ansi:
          enabled: always
    

2.3.日志文件

  • 输出文件

    SpringBoot 默认只把日志写在控制台,如果想额外记录到文件,可以在application.yml中添加logging.file.name or logging.file.path配置项。

    logging.file.name logging.file.path 示例 效果
    未指定 未指定 控制台输出
    指定 未指定 my.log 写入指定文件。可以加路径
    未指定 指定 /var/log 写入指定目录,文件名为spring.log
    指定 指定 logging.file.name为准
  • 滚动策略

    如果实现每天的日志单独存到一个文档中,每个文件3KB,超过大小切割成另外一个文件。可以通过application.yml文件指定logback日志滚动规则。

    logging:  
      file:
        path: log
      logback:
        rollingpolicy:
          max-file-size: 3kb                #存档前,每个日志文件的最大大小(默认值:10MB)
          file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz #文档格式
          max-history: 7                    #日志文件保存的最大天数(默认值:7)
          total-size-cap: 6KB               #日志文件被删除之前,可以容纳的最大大小(默认值:0B)
          clean-history-on-start: false     #应用启动时是否清除以前存档(默认值:false)
    

3.自定义配置

3.1.自定义日志配置文件

​ 自定义日志配置文件应是SpringBoot接口实现类的配置,名称建议:XXX-spring.xml,如使用标准名称spring无法完全控制日志初始化。提供两个日志配置文件:

  • logback-spring.xml配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="10 seconds">
      <!-- logger上下文名称(根据业务修改) -->
      <contextName>MyContextName</contextName>
      
      <!-- 定义了一个名为serverName的属性,它的值来自于logging.file.name,如果没有找到该属性默认为MyServerName(根据业务修改) -->
      <springProperty name="serverName" source="logging.file.name" defaultValue="MyServerName"/>
      <springProperty name="logging.path" source="logging.file.path" defaultValue="./logs/"/>
      
      <!-- 彩色日志依赖的渲染类 -->
      <!-- 定义了一个名为clr的转换规则,它使用org.springframework.boot.logging.logback.ColorConverter类进行转换,这个元素通常用于将日志输出中的文本着色,以便更容易地区分不同的日志级别或其他信息 -->
      <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
      <!-- WhitespaceThrowableProxyConverter和ExtendedWhitespaceThrowableProxyConverter都是用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示的类。它们之间的区别在于,ExtendedWhitespaceThrowableProxyConverter在输出异常信息时会包含更多的详细信息,例如异常的类名、方法名和行号等 -->
      <!-- 定义了一个名为wex的转换规则,它使用org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 -->
      <conversionRule conversionWord="wex"
                      converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
      <!-- 定义了一个名为wEx的转换规则,它使用org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 -->
      <conversionRule conversionWord="wEx"
                      converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
      
      <!-- 彩色日志格式 -->
      <!-- value值是日志输出模板, :-是属性名和其默认值之间的分隔符,作用与:相同 -->
      <!-- 定义日志输出格式的转换规则,%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期和时间,%clr表示将输出文本着色,{faint}表示使用淡色 -->
      <!-- %5p表示日志级别输出右对齐,左边以空格填充 -->
      <!-- ${PID:- }表示进程ID,%clr表示将输出文本着色,{magenta}表示使用洋红色 -->
      <!-- -表示一个分隔符 -->
      <!-- %t:显示产生该日志的线程名;%15:若字符长度小于15,则左边用空格填充;%.15:若字符长度超过15,截去多余字符 -->
    <!-- %-40:若字符长度小于40,则右边用空格填充;%.40:若字符长度超过40,截去多余字符;logger{39}对应的是“logging.WARNING”级别。具体来说,Python的logging模块定义了以下几个级别(从低到高):NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL。因此,logger{39}表示的是WARNING级别,即日志记录器会记录所有WARNING级别及以上的日志信息 -->
      <!-- %m表示日志消息;%n表示换行符;${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}表示异常信息。如果日志输出中包含异常信息,这个规则将会将其转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 -->
      <property name="CONSOLE_LOG_PATTERN"
                value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
      
      <!--1. 输出到控制台-->
      <!-- 定义控制台日志输出的appender,class="ch.qos.logback.core.ConsoleAppender"表示使用Logback框架提供的ConsoleAppender类来输出日志到控制台 -->
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
          <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
          <!-- 定义日志输出级别的过滤器,class="ch.qos.logback.classic.filter.ThresholdFilter"表示使用Logback框架提供的ThresholdFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 -->
          <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
              <level>debug</level>
          </filter>
          <encoder>
              <!-- ${CONSOLE_LOG_PATTERN}表示控制台日志输出格式,UTF-8表示编码格式 -->
              <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
              <!-- 设置字符集 -->
              <charset>UTF-8</charset>
          </encoder>
      </appender>
      <!--2. 输出到文档-->
      <!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
      <!-- 定义文件日志输出的appender,class="ch.qos.logback.core.rolling.RollingFileAppender"表示使用Logback框架提供的RollingFileAppender类来输出日志到文件 -->
      <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 正在记录的日志文档的路径及文档名 -->
          <file>${logging.path}/web_debug.log</file>
          <!--日志文档输出格式-->
          <encoder>
              <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
              <charset>UTF-8</charset> <!-- 设置字符集 -->
          </encoder>
          <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
          <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"表示使用Logback框架提供的TimeBasedRollingPolicy类来定义日志文件的滚动策略 -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <!-- 日志归档 -->
              <!-- 定义日志文件名的模式。在这个模式中,${logging.path}表示日志文件的路径,%d{yyyy-MM-dd}表示日期格式,%i表示文件索引 -->
              <fileNamePattern>${logging.path}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
              <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"表示使用Logback框架提供的SizeAndTimeBasedFNATP类来定义日志文件的滚动策略,<maxFileSize>100MB</maxFileSize>表示日志文件的最大大小为100MB。这个滚动策略通常用于按照时间和文件大小滚动日志文件,以便更好地管理日志文件的大小和数量 -->
              <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                  <maxFileSize>100MB</maxFileSize>
              </timeBasedFileNamingAndTriggeringPolicy>
              <!--日志文档保留天数-->
              <maxHistory>15</maxHistory>
          </rollingPolicy>
          <!-- 此日志文档只记录debug级别的 -->
          <!-- 定义日志输出级别的过滤器。在这个过滤器中,class="ch.qos.logback.classic.filter.LevelFilter"表示使用Logback框架提供的LevelFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
              <level>debug</level>
              <!-- <onMatch>ACCEPT</onMatch>表示如果日志事件与过滤器匹配,则接受该事件,<onMismatch>DENY</onMismatch>表示如果日志事件与过滤器不匹配,则拒绝该事件 -->
              <onMatch>ACCEPT</onMatch>
              <onMismatch>DENY</onMismatch>
          </filter>
      </appender>
      <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
      <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 正在记录的日志文档的路径及文档名 -->
          <file>${logging.path}/web_info.log</file>
          <!--日志文档输出格式-->
          <encoder>
              <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
              <charset>UTF-8</charset>
          </encoder>
          <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <!-- 天天日志归档路径以及格式 -->
              <fileNamePattern>${logging.path}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
              <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                  <maxFileSize>100MB</maxFileSize>
              </timeBasedFileNamingAndTriggeringPolicy>
              <!--日志文档保留天数-->
              <maxHistory>15</maxHistory>
          </rollingPolicy>
          <!-- 此日志文档只记录info级别的 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
              <level>info</level>
              <onMatch>ACCEPT</onMatch>
              <onMismatch>DENY</onMismatch>
          </filter>
      </appender>
      <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
      <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 正在记录的日志文档的路径及文档名 -->
          <file>${logging.path}/web_warn.log</file>
          <!--日志文档输出格式-->
          <encoder>
              <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
              <charset>UTF-8</charset> <!-- 此处设置字符集 -->
          </encoder>
          <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <fileNamePattern>${logging.path}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
              <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                  <maxFileSize>100MB</maxFileSize>
              </timeBasedFileNamingAndTriggeringPolicy>
              <!--日志文档保留天数-->
              <maxHistory>15</maxHistory>
          </rollingPolicy>
          <!-- 此日志文档只记录warn级别的 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
              <level>warn</level>
              <onMatch>ACCEPT</onMatch>
              <onMismatch>DENY</onMismatch>
          </filter>
      </appender>
      <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
      <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 正在记录的日志文档的路径及文档名 -->
          <file>${logging.path}/web_error.log</file>
          <!--日志文档输出格式-->
          <encoder>
              <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
              <charset>UTF-8</charset> <!-- 此处设置字符集 -->
          </encoder>
          <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <fileNamePattern>${logging.path}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
              <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                  <maxFileSize>100MB</maxFileSize>
              </timeBasedFileNamingAndTriggeringPolicy>
              <!--日志文档保留天数-->
              <maxHistory>15</maxHistory>
          </rollingPolicy>
          <!-- 此日志文档只记录ERROR级别的 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
              <level>ERROR</level>
              <onMatch>ACCEPT</onMatch>
              <onMismatch>DENY</onMismatch>
          </filter>
      </appender>
    <!--     4.1 开发环境:打印控制台-->
      <!-- 用于在Spring Boot应用程序中配置日志记录的标签。在这个标签中,name="dev"表示这个配置文件只在dev环境中生效,<logger name="com.myClass.controller" level="debug"/>表示为com.myClass.controller(根据业务修改)这个包下的类配置日志输出级别为debug -->
          <springProfile name="dev">
              <logger name="com.xxxxx.controller" level="debug"/>
          </springProfile>
      <!-- 用于配置日志输出的标签。在这个标签中,level="info"表示日志输出级别为info,<appender-ref ref="CONSOLE"/>、<appender-ref ref="DEBUG_FILE"/>、<appender-ref ref="INFO_FILE"/>、<appender-ref ref="WARN_FILE"/>、<appender-ref ref="ERROR_FILE"/>表示将日志输出到不同的appender中,分别为控制台、debug文件、info文件、warn文件和error文件 -->
      <root level="info">
          <appender-ref ref="CONSOLE"/>
          <appender-ref ref="DEBUG_FILE"/>
          <appender-ref ref="INFO_FILE"/>
          <appender-ref ref="WARN_FILE"/>
          <appender-ref ref="ERROR_FILE"/>
      </root>
    </configuration>
    
  • log4j2-spring.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--      Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,
       当设置成trace时,可以看到log4j2内部各种详细输出
    -->
    <!-- monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
    <configuration monitorInterval="5">
      <!-- 日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    
      <!-- 变量配置 -->
      <Properties>
          <!--
              格式化输出:
              %d表示日期,
              %thread表示线程名,
              %-5level:级别从左显示5个字符宽度
              %msg:日志消息,%n是换行符
              %logger{36} 表示 Logger 名字最长36个字符
          -->
          <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level}[%thread] %style{%logger{36}}{cyan} : %msg%n" />
    
          <!-- 定义日志存储的路径,不要配置相对路径 -->
          <property name="FILE_PATH" value="此处更换为你的日志文件存储路径" />
          <property name="FILE_NAME" value="此处更换为你的项目名称" />
      </Properties>
    
      <appenders>
          <console name="Console" target="SYSTEM_OUT">
              <!--输出日志的格式-->
              <PatternLayout pattern="${LOG_PATTERN}" disableAnsi="false" noConsoleNoAnsi="false"/>
              <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
              <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
          </console>
    
          <!--
            这个会打印出所有的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="20MB"/>
              </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)-->
              <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
              <PatternLayout pattern="${LOG_PATTERN}"/>
              <Policies>
                  <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                  <TimeBasedTriggeringPolicy interval="1"/>
                  <SizeBasedTriggeringPolicy size="20MB"/>
              </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="20MB"/>
              </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="RollingFileInfo"/>
              <appender-ref ref="RollingFileWarn"/>
              <appender-ref ref="RollingFileError"/>
          </root>
      </loggers>
    </configuration>
    

3.2.切换日志组合

  • 通过修改pom.xml配置,应用自定义日志配置文件

    <!--排除系统默认的日志-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <exclusions>
          <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-log4j2</artifactId>
    </dependency>
    

4.程序中如何使用日志?

4.1.创建日志变量

​ 在需要记录日志的类中创建变量,也可以将其封装到单独的类,通过继承来实现公用的目的。

@RestController
public class LogController {
	private static final Logger log=LoggerFactory.getLogger(LogController.class);
	@GetMapping("/hello")
	public String send() {
		log.info("hello world");
		log.error("send error");
		return "hello world";
	}
}

4.2.注解实现(推荐)

​ 导入Lombok依赖,使用@Slf4j

@RestController
@Slf4j
public class LogController {
	@GetMapping("/hello")
	public String send() {
		log.info("hello world");
		log.error("send error");
		return "hello world";
	}
}

5.最佳实践

  • SpringBoot框架下,导入任何第三方框架,先排除它的日志包,因为SpringBoot底层控制好了日志,不需要第三方框架自带日志,方便管理。
  • 修改application.yml配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如logback-spring.xml, log4j2-spring.xml。
  • 如需对接专业日志系统,也只需要把logback记录的日志灌倒kafka之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可。
  • 业务中使用slf4j-api记录日志,不要再sout了。

更多推荐