SpringBoot 日志集成SLF4J —— 配置详解

1. maven依赖

<dependency>
     <groupId>org.springframework.bootgroupId>
     <artifactId>spring-boot-starter-loggingartifactId>
     <version>2.6.13version>
 dependency>
 <dependency>
    <groupId>org.slf4jgroupId>
    <artifactId>slf4j-apiartifactId>
    <version>1.7.32version>
dependency>

2. slf4j配置结构

configuration:配置根目录
  conversionRule:彩色日志,配置之后控制台输出的日志信息是彩色的,非常好看
  appender:日志输出配置规则
    file:日志文件输出路径
    encoder:日志文件输出格式
      pattern:日志文件输出模板格式
      charset:日志文件输出编码方式
    rollingPolicy:日志记录器的滚动策略;简单来说就是一天过后把前一天的日志文件名变成 "2021-xx-xx.log";每个日志文件最大尺寸多少,超过尺寸后多余部分生成一个新的日志文件等,一些动态的策略处理
      fileNamePattern:滚动策略输出日志文件目录,及文件名模板;以尺寸策略来说,超过10m的文件,多余部分输出的文件名和路劲为appender的file值,已满10m的部分输出路径为此值
      timeBasedFileNamingAndTriggeringPolicy:设置日志文件尺寸滚动策略
        maxFilesSize:单个日志文件最大size
      maxHistory:日志文件最大保存时间
    filter:日志文件记录数据过滤器
      level:只记录对应等级的记录
      onMatch:常量:ACCEPT
      onMismatch:常量:DENY
  root:设置日志记录写入和控制器打印等级,低于这个等级的记录不写入日志文件,不在控制器打印
    appender-ref:日志规则生效列表,值为appender对应的name属性,只有name存在appender-ref的appender配置才会生效;
  logger:指定某个报下的日志输出规则,配置之后只要是这个包下产生的记录,都是遵循此规则,并且与root中配置的appender-ref重复的话,会叠加生效
    appender-ref:使用的日志生成规则
  springProfile:设置不同环境的配置,上诉标签除了configuration都可以放置在此标签内;会根据不同的环境,使用不同的规则

3. 案例详解

3.1 configuration

配置文件的根节点






<configuration scan="true" scanPeriod="10 seconds" debug="false">
    <conversionRule ....>conversionRule>
    <root ....>root>
    <appender ...>appender>
configuration>
3.2 conversionRule

配置完彩色日志后,就可以在模板内使用彩色变量,使得输出的日志记录变成彩色的,稍后在pattern中举例使用彩色变量,现在先配置


<configuration scan="true" scanPeriod="10 seconds" debug="false">   ......一些其他的配置  
            
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    
configuration>
3.3 appender

日志输出规则




<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        
        
        <level>infolevel>
    filter>
    
    <encoder>
        
        <Pattern>
            ${
            CONSOLE_LOG_PATTERN:- //常量
            %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} //%clr表示使用conversionRule中conversionWord为clr的converterClass输出()中的变量文本;%d表示日期;{faint}表示颜色;颜色值有[faint:灰白,red,green,yellow,blue,magenta,cyan]
            %clr(${LOG_LEVEL_PATTERN:-%5p})
            %clr(${PID:- }){magenta}
            %clr(---){faint}
            %clr([%15.15t]){faint}
            %clr(%-40.40logger{39}){cyan}
            %clr(:){cyan}
            %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
            }
        Pattern>
        
        <charset>UTF-8charset>
    encoder>
appender>
3.4 Pattern中特殊符号含义
-X号: X信息输出时左对齐;
%p: //输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: //输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: //输出自应用启动到输出该log信息耗费的毫秒数
%c: //输出日志信息所属的类目,通常就是所在类的全名
%t: //输出产生该日志事件的线程名
%l: //输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
%x: //输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: //输出一个”%”字符
%F: //输出日志消息产生时所在的文件名称
%L: //输出代码中的行号
%m://输出代码中指定的消息,产生的日志具体信息
%n: //输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
3.5 appender

根据等级设置多个日志输出规则,把不同等级的日志分别存储,配置多个appender


<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}}"/>



<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>infolevel>
    filter>
    <encoder>
        <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
        
        <charset>UTF-8charset>
    encoder>
appender>





<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
    <file>${log.path}/log_debug.logfile>
    
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        <charset>UTF-8charset> 
    encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        
        <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.logfileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>100MBmaxFileSize>
        timeBasedFileNamingAndTriggeringPolicy>
        
        <maxHistory>15maxHistory>
    rollingPolicy>
    
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>debuglevel>
        <onMatch>ACCEPTonMatch>
        <onMismatch>DENYonMismatch>
    filter>
appender>


<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
    <file>${log.path}/log_info.logfile>
    
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        <charset>UTF-8charset>
    encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        
        <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>100MBmaxFileSize>
        timeBasedFileNamingAndTriggeringPolicy>
        
        <maxHistory>15maxHistory>
    rollingPolicy>
    
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>infolevel>
        <onMatch>ACCEPTonMatch>
        <onMismatch>DENYonMismatch>
    filter>
appender>


<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
    <file>${log.path}/log_warn.logfile>
    
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        <charset>UTF-8charset> 
    encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>1KBmaxFileSize>
        timeBasedFileNamingAndTriggeringPolicy>
        
        <maxHistory>15maxHistory>
    rollingPolicy>
    
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>warnlevel>
        <onMatch>ACCEPTonMatch>
        <onMismatch>DENYonMismatch>
    filter>
appender>



<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
    <file>${log.path}/log_error.logfile>
    
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        <charset>UTF-8charset> 
    encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>100MBmaxFileSize>
        timeBasedFileNamingAndTriggeringPolicy>
        
        <maxHistory>15maxHistory>
    rollingPolicy>
    
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERRORlevel>
        <onMatch>ACCEPTonMatch>
        <onMismatch>DENYonMismatch>
    filter>
appender>
3.6 root

appender必须要放置在root中,才能生效


<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>
3.7 logger

更精确的指定annender生效范围




<logger name="com.example.mybitesstudy02.service" level="info">
    <appender-ref ref="CONSOLE"/>
logger>
3.8 springProfile

指定不同环境下的日志配置,注意springProfile判断当前是处于什么环境,取决于spring boot配置文件(application.properties)的spring.profiles.active值,默认是default


 <root level="info">
     <appender-ref ref="DEBUG_FILE"/>
     <appender-ref ref="INFO_FILE"/>
     <appender-ref ref="WARN_FILE"/>
     <appender-ref ref="ERROR_FILE"/>
 root>

 
 <springProfile name="dev">
     <root level="info">
         <appender-ref ref="CONSOLE"/>
     root>
 springProfile>
 
 
 <springProfile name="pro">
     <root level="info">
         <appender-ref ref="CONSOLE"/>
         <appender-ref ref="INFO_FILE"/>
         <appender-ref ref="ERROR_FILE"/>
     root>
 springProfile>

4. 超详细配置案例






<configuration  scan="true" scanPeriod="10 seconds">
    <contextName>logbackcontextName>

    
    
    <springProperty scope="context" name="log.path" source="logging.file.path"/>
    <springProperty scope="context" name="log.name" source="logging.file.name"/>

    
    
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    
    <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}}"/>
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debuglevel>
        filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
            
            <charset>UTF-8charset>
        encoder>
    appender>

    
    
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <file>${log.path}/${log.name}_debug.logfile>
        
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset> 
        encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/${log.name}-debug-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            
            <maxHistory>30maxHistory>
        rollingPolicy>
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debuglevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <file>${log.path}/${log.name}_info.logfile>
        
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/${log.name}-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            
            <maxHistory>30maxHistory>
        rollingPolicy>
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>infolevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <file>${log.path}/${log.name}_warn.logfile>
        
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset> 
        encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${log.name}-warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            
            <maxHistory>30maxHistory>
        rollingPolicy>
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warnlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <file>${log.path}/${log.name}_error.logfile>
        
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset> 
        encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${log.name}-error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            
            <maxHistory>30maxHistory>
        rollingPolicy>
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERRORlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>
    

    
    <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>

参考资料

spring boot --接入@SLF4J日志(二)日志配置详解

你可能感兴趣的:(tips,spring,boot,spring,slf4j)