关于springboot:笑小枫的SpringBoot系列六SpringBoot日志打印Logback详解

39次阅读

共计 15416 个字符,预计需要花费 39 分钟才能阅读完成。

什么是 Logback

Logback 旨在作为风行的 log4j 我的项目的继承者,是 SpringBoot 内置的日志解决框架,spring-boot-starter 其中蕴含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 logback。具体如下图所示👇

<img src=”http://file.xiaoxiaofeng.site/blog/image/2022/07/17/20220717123855.png”/>

官网文档:http://logback.qos.ch/manual/

SpringBoot 应用 logback 介绍

在咱们启动 SpringBoot,发现咱们并没有被动去配置过任何和日志打印的相干配置,然而控制台却打印了相干的启动日志;因为 SpringBoot 为 Logback 提供了默认的配置文件 base.xml,base.xml 文件里定义了默认的 root 输入级别为 INFO。零碎打印的日志信息如下:

咱们能够到 SpringBoot 源码里看一下 base.xml 具体是如何配置的,如下图所示👇

自定义 logback 配置

能够看到默认的配置是非常简单,那么咱们能够自定义配置吗?答案当然是必定的🙈

在 resources 目录下创立文件logback-spring.xml,具体配置如下👇

<?xml version="1.0" encoding="UTF-8"?>
 
<configuration scan="true" scanPeriod="60 seconds">

    <springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
 
    <!-- 定义参数 -->
    <property name="log.lever" value="debug" />
    <property name="log.maxHistory" value="365" />
     <property name="log.filePath" value="logs"></property>
<!--     如果这里不想写死 C 盘,那么下面的配置,零碎会主动在我的项目所在的盘符创立文件夹 -->
<!--    <property name="log.filePath" value="C:/{spring.application.name}_log"></property>-->
<!--     <property name="log.pattern" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" /> -->
    <property name="log.pattern" value="%-12(%d{MM-dd HH:mm:ss}) %c [%L] | %msg%n" />
 
    <!-- 控制台设置 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
    <!--    <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>-->
        <encoder>
            <!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
            <!-- 格式化输入:%d: 示意日期    %thread: 示意线程名     %-5level: 级别从左显示 5 个字符宽度  %msg: 日志音讯    %n: 是换行符 -->
            <pattern>%boldMagenta(笑小枫控制台 -) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %yellow(%logger) - %cyan(%msg%n)</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
 
    <!-- DEBUG -->
    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件门路 -->
        <file>${log.filePath}/${spring.application.name}_debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件名称 -->
            <fileNamePattern>${log.filePath}/debug/${spring.application.name}_debug.%d{yyyy-MM-dd}.log.gz
            </fileNamePattern>
            <!-- 文件最大保留历史数量 -->
            <MaxHistory>${log.maxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>  
            <onMismatch>DENY</onMismatch>  
        </filter>
    </appender>
    
    <!-- INFO -->
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件门路 -->
        <file>${log.filePath}/${spring.application.name}_info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件名称 -->
            <fileNamePattern>${log.filePath}/info/${spring.application.name}_info.%d{yyyy-MM-dd}.log.gz
            </fileNamePattern>
            <!-- 文件最大保留历史数量 -->
            <MaxHistory>${log.maxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>  
            <onMismatch>DENY</onMismatch>  
        </filter>
    </appender>
    
    <!-- ERROR -->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件门路 -->
        <file>${log.filePath}/${spring.application.name}_error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件名称 -->
            <fileNamePattern>${log.filePath}/error/${spring.application.name}_error.%d{yyyy-MM-dd}.log.gz
            </fileNamePattern>
            <!-- 文件最大保留历史数量 -->
            <MaxHistory>${log.maxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>  
            <onMismatch>DENY</onMismatch>  
        </filter>
    </appender>
<!--     上线后如果要查看谬误日志,能够把 level=info 改为 level=debug -->
    <root level="info">
        <appender-ref ref="consoleAppender" />
        <appender-ref ref="debugAppender" />
        <appender-ref ref="infoAppender" />
        <appender-ref ref="errorAppender" />
    </root>
</configuration>

咱们在启动一下程序,看下成果👇

可见多了很多咱们自定的一些配置,包含控制台前缀和打印日志的色彩等~

同时咱们还能够在我的项目目录下看到咱们配置的 logs 日志归档目录文件。

模仿抛出一个零碎异样,能够看到谬误日志信息,同时能够在 logs 的 error 日志中看到谬误日志,如上面图所示👇

真心喜爱我的这个配色,总是能让我撸代码的时候放弃身心愉悦🐾如下所示,从别的篇章捞的截图,爱了爱了💕

logback 配置属性详解

在下面咱们曾经实现了自定义配置 logback 的打印,接下来咱们具体解说一下对应的属性,不便大家依据本人理论业务去配置。

根节点 < configuration>

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
    <!-- 其余配置省略 -->  
</configuration>
  1. scan : 当此属性设置为 true 时,配置文件如果产生扭转,将会被从新加载,默认值为 true。
  2. scanPeriod : 设置监测配置文件是否有批改的工夫距离,如果没有给出工夫单位,默认单位是毫秒。当 scan 为 true 时,此属性失效。默认的工夫距离为 1 分钟。
  3. debug : 当此属性设置为 true 时,将打印出 logback 外部日志信息,实时查看 logback 运行状态。默认值为 false。

子节点:< property>

<property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>

用来定义变量值的标签,< property> 有两个属性,name 和 value;其中 name 的值是变量的名称,value 的值时变量定义的值, 通过定义的值会被插入到 logger 上下文中。定义变量后,能够使“${}”来应用变量。

注:多环境配置下,通过 application.yml 传递参数过去,< property > 取不到环境参数,得用 < springProperty >。

<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="springBoot"/>

子节点:< appender>

appender 用来格式化日志输入节点,有两个属性 name 和 class,class 用来指定哪种输入策略,罕用就是控制台输入策略和文件输入策略。

  • ConsoleAppender:就想他的名字一样,将日志信息打印到管制台上,更加精确的说:应用 System.out 或者 System.err 形式输入,次要子标签有:encoder,target
  • FileAppender:用于将日志信息输入到文件中,次要子标签有:append,encoder,file
  • RollingFileAppender:从名字咱们就能够得出:FileAppender 是 RollingFileAppender 的父类。即 RollingFileAppender 继承 FIleAppender 类。性能:可能动静的创立一个文件。也就是说:到满足肯定的条件,就会创立一个新的文 件,而后将日志写入到新的文件中。有两个重要的标签与 rolingFileAppender 进行交互:RollingPolicyTriggeringPolicy,次要子标签:file,append,encoder,rollingPolicy,triggerPolicy

以下别离介绍这些标签:

file

被写入的文件名,能够是绝对目录,也能够是相对目录,如果下级目录不存在会主动创立,没有默认值。

target

设置一 System.out 还是 System.err 形式输入。默认值为 System.out

append

如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是 true。

prudent
  • FileAppender:如果是 true,日志会被平安的写入文件,即便其余的 FileAppender 也在向此文件做写入操作,效率低,默认是 false。
  • RollingFileAppender:当为 true 时,不反对 FixedWindowRollingPolicy。反对 TimeBasedRollingPolicy,然而有两个限度,1 不反对也不容许文件压缩,2 不能设置 file 属性,必须留空。
layout 和 encoder
<!-- 输入到控制台 ConsoleAppender-->
<appender name="consoleLog1" class="ch.qos.logback.core.ConsoleAppender">
    <layout>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </layout>
</appender>

<!-- 输入到控制台 ConsoleAppender-->
<appender name="consoleLog2" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d -2 %msg%n</pattern>
    </encoder>
</appender>
<!-- 设置我的项目日志输入级别为 INFO-->
<root level="INFO">
    <appender-ref ref="consoleLog1"/>
    <appender-ref ref="consoleLog2"/>
</root>

能够看到 appender 的子节点 layout 和 encoder 都能够输入,都能够将事件转换为格式化后的日志记录,然而控制台输入应用 layout,文件输入应用 encoder。自从 0.9.19 版本之后,Fileappender 和他的子类是冀望应用 encoder,不再应用 layout。

layout 和 encoder 区别
  1. encoder:次要工作有两个:①将一个 event 事件转换成一组 byte 数组,②将转换后的字节数据输入到文件中。
  2. encoder 组件是在 0.9.19 版本之后才引进来的。在以前的版本中,appender 是应用 layout(将一个 event 事件转换成一个字符串),而后应用【java.io.writer】对象将字符串写入到文件中。
  3. 自从 0.9.19 版本之后,Fileappender 和他的子类是冀望应用 encoder,不再应用 layout。
  4. 其中 layout 仅仅实现了将一个 event 事件转换成一个字符串这一个性能。此外,layout 不能管制将字符串写出到文件。layout 不能整合 event 事件到一组中。与 encoder 相比,不仅仅能依照格局进行转化,而且还能将数据写入到文件中。

因为 layout 曾经不再举荐应用了,那么这里重点讲一下 encoder。

其中 patternLayoutEncoder 是最常应用 encoder,也就是默认的,默认就是 PatternLayoutEncoder 类,他蕴含可 patternLayout 大部分的工作。

几个重要的 encoder
  1. LayoutWrappingEncoder:(不怎么用)

    1. 在 0.9.19 版本之前,都是应用 layout 来管制输入的格局。那就存在大量的 layout 接口(自定义)的代码。在 0.9.19 就变成了应用 encoder 来管制,如果咱们想应用以前的 layout 怎么办?这个 LayoutWrappingEncoder 就是为了 encoder 可能操作外部 layout 存在的。即这个类在 encoder 与 layout 之间提供一个桥梁。这个类实现了 encoder 类,又蕴含了 layout 将 evnet 事件装换成字符串的性能。2. 原理:应用 layout 将输出的 evnet 事件转换成一个字符串,而后将字符串依照用户指定的编码转换成 byte 数组。最初将 byte 数据写入到文件中去。3. 在默认的状况下,输入流是立刻刷新的。除非 immediateFlush 属性值为 false,就不会立刻刷新,然而为进步 logger 接入量。
  2. PatternLayoutEncoder:罕用。他是 LayoutWrappingEncoder 的子类
1. 思考到 PatternLayout 是 layout 中最罕用的组件,所以 logback 人员开发出了 patternLayoutEncoder 类,这个类是 LayoutWrappingEncoder 的扩大,这个类蕴含了 PatternLayout。2.immediateFlush 标签与 LayoutWrappingEncoder 是一样的。默认值为【true】。这样的话,在已存在的我的项目就算没有失常状况下的敞开,也能记录所有的日志信息到磁盘上,不会失落任何日志信息。因为是立刻刷新。如果将【immediateFlush】设置为【false】,可能就是五倍的原来的 logger 接入量。然而可能会失落日志信息在没有失常敞开我的项目的状况下。例如:<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
  <file>foo.log</file>
  <encoder><!-- 默认就是 PatternLayoutEncoder 类 -->
    <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
    <!-- this quadruples logging throughput -->
    <immediateFlush>false</immediateFlush>
  </encoder> 
</appender>

3. 如果想在文件的结尾打印出日志的格局信息:即打印日志的模式。应用【outputPatternAsHeader】标签,并设置为【true】. 默认值为【false】。例如:<!-- 输入到控制台 ConsoleAppender-->
<appender name="consoleLog2" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d -2 %msg%n</pattern>
        <outputPatternAsHeader>true</outputPatternAsHeader>
    </encoder>
</appender>
他就会在打印开始之前第一句输入日志格局,如:#logback.classic pattern: %d -2 %msg%n

patternLayoutEncoder 类既有 layout 将一个事件转化为字符串,又有将字符创写入到文件中的作用。他是 encoder 标签的默认类实例。

filter
  • 简介
    logback 具备过滤器反对。logbcak 容许给日志记录器 appender 配置一个或多个 Filter(或者给整体配置一个或多个 TurboFilter),来管制: 当满足过滤器指定的条件时,才记录日志(或不满足条件时,回绝记录日志)。logback 反对自定义过滤器,当然 logback 也自带了一些罕用的过滤器,在绝大多数时候,自带的过滤器其实就够用了,个别是不须要自定义过滤器的。
  • logback 提供的过滤器反对次要分两大类:

    ch.qos.logback.core.filter.Filter
    ch.qos.logback.classic.turbo.TurboFilter
  • Filter 与 TurboFilter 自带的几种罕用过滤器

    过滤器 起源 阐明 绝对罕用
    LevelFilter Filter 对指定 level 的日志进行记录(或不记录),对不等于指定 level 的日志不记录(或进行记录)
    ThresholdFilter Filter 对大于或等于指定 level 的日志进行记录(或不记录),对小于指定 level 的日志不记录(或进行记录) 提醒:info 级别是大于 debug 的
    EvaluatorFilter Filter 对满足指定表达式的日志进行记录(或不记录),对不满足指定表达式的日志不作记录(或进行记录)
    MDCFilter TurboFilter 若 MDC 域中存在指定的 key-value,则进行记录,否者不作记录
    DuplicateMessageFilter TurboFilter 依据配置不记录多余的反复的日志
    MarkerFilter TurboFilter 针对带有指定标记的日志,进行记录(或不作记录)

    TurboFilter 的性能是优于 Filter 的,这是因为 TurboFilter 的作用机会是在创立日志事件 ILoggingEvent 对象之前,而 Filter 的作用机会是在创立之后 。若一个日志注定是会被过滤掉不记录的,那么创立 ILoggingEvent 对象(包含后续的参数组装办法调用等) 这个步骤无疑是十分耗费性能的。

这里次要介绍两种 filter

ThresholdFilter:

ThresholdFilter 为零碎定义的拦截器,例如咱们用 ThresholdFilter 来过滤掉 ERROR 级别以下的日志不输入到文件中。如果不必记得正文掉,不然你控制台会发现没日志

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
</filter>

LevelFilter

如果只是想要 Info 级别的日志,只是过滤 info 还是会输入 Error 日志,因为 Error 的级别高,所以咱们应用上面的策略,能够防止输入 Error 的日志

<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <!-- 过滤 Error-->
    <level>ERROR</level>
    <!-- 匹配到就禁止 -->
    <onMatch>DENY</onMatch>
    <!-- 没有匹配到就容许 -->
    <onMismatch>ACCEPT</onMismatch>
</filter>

FilterReply 有三种枚举值:

  • DENY:示意不必看前面的过滤器了,这里就给回绝了,不作记录。
  • NEUTRAL:示意需不需要记录,还须要看前面的过滤器。若所有过滤器返回的全部都是 NEUTRAL,那么须要记录日志。
  • ACCEPT:示意不必看前面的过滤器了,这里就给间接批准了,须要记录。
rollingPolicy
  • TimeBasedRollingPolicy:它依据工夫来制订滚动策略. 工夫滚动策略能够基于工夫滚动按工夫生成日志。
    上面是官网给出的示例:

    <configuration>
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <!-- daily rollover -->
          <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
          <!-- keep 30 days' worth of history capped at 3GB total size -->
          <maxHistory>30</maxHistory>
          <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
    
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender> 
    
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration>

    紧跟着又给出的多个 JVM 写同一个日志文件的配置,次要是加一行开启(勤俭)prudent 模式

  <configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- Support multiple-JVM writing to the same log file -->
      <prudent>true</prudent>
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory> 
        <totalSizeCap>3GB</totalSizeCap>
      </rollingPolicy>

      <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
      </encoder>
    </appender> 

    <root level="DEBUG">
      <appender-ref ref="FILE" />
    </root>
  </configuration>
  • SizeAndTimeBasedRollingPolicy:基于大小和工夫的滚动策略
    这个策略呈现的起因就是对工夫滚动策略的一个补充,使其不仅按工夫进行生成而且思考到文件大小的起因,因为在基于工夫的滚动策略生成的日志文件,只是对一段时间总的日志大小做了限定,然而没有对每个日志文件的大小做限定,这就会造成个别日志文件过大,前期传递,浏览艰难的问题,所以就有了这第二个策略。

    上面是官网给的示例:

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>
  • FixedWindowRollingPolicy:基于固定窗口的滚动策略
    这个策略的呈现,我集体猜想是因为须要日志文件放弃为某个特定的数量,避免滚动测策略导致过多的日志文件呈现。这个策略呈现得配合 triggeringPolicy, 给一个什么时候日志滚动一次的管制,这部分是跟下面两种策略所不一样的中央。
    上面是官网给出的示例:
<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

留神:在 RollingFileAppender 中有一个 file 标签,也是设置文件的名称的。file 能够设置 也能够不设置。如果你设置了 file 标签的话,他就不会转换到新的文件中。所有的日志 信息将会输出到同一个文件中。如果 file 标签没有设置。文件的名称就会在每一个阶段 由 filenamePattern 计算得出。

fileNamePattern:这是一个强制的标签。他的值能够蕴含:文件的名称、适当的 %d 转 换说明符。这个 %d 说明符能够蕴含一个【日期和工夫】的模式。其中【模式】相似于【SimpleDateFormat】类。如果这个【模式】没有写的话,默认就是【yyyy-MM-dd】的模式。转换文件的名称从 fileNamePattern 中失去

maxHistory:这是一个可选的标签。以异步形式删除较旧的文件, 例如,如果您指定每月滚动,并将 maxHistory 设置为 6,则将保留 6 个月的归档文件,并删除 6 个月以上的文件。

totalSizeCap:这是一个可选的标签。这是所有日志文件的总大小空间。当日志文件的空间超过了设置的最大 空间数量,就会删除旧的文件。留神:这个标签必须和 maxHistory 标签一起应用。

cleanHistoryOnStart:如果设置为 true,则将在追加程序启动时执行归档删除。默认状况下,此属性设置为 false。

子节点:< loger>

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 < appender >。< loger > 仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。

  • name: 用来指定受此 loger 束缚的某一个包或者具体的某一个类。
  • level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值 INHERITED 或者同义词 NULL,代表强制执行下级的级别。如果未设置此属性,那么以后 loger 将会继承下级的级别。
  • addtivity: 是否向下级 loger 传递打印信息。默认是 true。

loger 在理论应用的时候有两种状况

  • 第一种:带有 loger 的配置,不指定级别,不指定 appender

    <logger name="com.xf.controller.TestLogController"/>

    将 TestLogController 类的日志的打印,然而并没用设置打印级别,所以继承他的下级的日志级别“info”;没有设置 addtivity,默认为 true,将此 loger 的打印信息向下级传递;没有设置 appender,此 loger 自身不打印任何信息。

    < root level=“info”> 将 root 的打印级别设置为“info”,指定了名字为“console”的 appender。当执行 com.xf.controller.TestLogController 类的 testLog 办法时,所以首先执行 < logger name=“com.xf.controller.TestLogController”/>,将级别为“info”及大于“info”的日志信息传递给 root,自身并不打印;root 接到上级传递的信息,交给曾经配置好的名为“console”的 appender 解决,“console”appender 将信息打印到控制台;

  • 第二种:带有多个 loger 的配置,指定级别,指定 appender

    <configuration>
        <logger name="com.xf.controller.TestLogController" level="WARN" additivity="false">
            <appender-ref ref="console"/>
        </logger>
    </configuration>

管制 com.xf.controller.TestLogController 类的日志打印,打印级别为“WARN”;additivity 属性为 false,示意此 loger 的打印信息不再向下级传递; 指定了名字为“console”的 appender;

这时候执行 com.xf.controller.TestLogController 类的 login 办法时,先执行 < logger name=“com.xf.controller.TestLogController”level=“WARN”additivity=“false”>, 将级别为“WARN”及大于“WARN”的日志信息交给此 loger 指定的名为“console”的 appender 解决,在控制台中打出日志,不再向下级 root 传递打印信息。

注:当然如果你把 additivity=”false” 改成 additivity=”true” 的话,就会打印两次,因为打印信息向下级传递,logger 自身打印一次,root 接到后又打印一次。

子节点:< root >

root 节点是必选节点,用来指定最根底的日志输入级别,只有一个 level 属性。level 默认是 DEBUG。

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

能够蕴含零个或多个元素,标识这个 appender 将会增加到这个 loger。

<root level="debug">
  <appender-ref ref="console" />
  <appender-ref ref="file" />
</root>

多环境配置

<springProfile>标签容许你自在的蕴含或排除基于激活的 Spring profiles 的配置的一部分。在 <configuration> 元素的任何中央都反对 Profile 局部。应用 name 属性来指定哪一个 profile 承受配置。多个 profiles 能够用一个逗号分隔的列表来指定。

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev, staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

小结

好啦,本文就到这里了,咱们简略的总结一下,次要介绍了以下内容👇👇

  • 简略介绍了 logback
  • 自定义 logback 打印配置
  • 详解 logback 配置信息

对于笑小枫💕

本章到这里完结了,喜爱的敌人关注一下我呦😘😘,大伙的反对,就是我保持写下去的能源。
老规矩,懂了就点赞珍藏;不懂就问,日常在线,我会就会回复哈~🤪
微信公众号:笑小枫
笑小枫集体博客:https://www.xiaoxiaofeng.com
CSDN:https://zhangfz.blog.csdn.net
本文源码:https://github.com/hack-feng/maple-demo

正文完
 0