共计 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>
- scan : 当此属性设置为 true 时,配置文件如果产生扭转,将会被从新加载,默认值为 true。
- scanPeriod : 设置监测配置文件是否有批改的工夫距离,如果没有给出工夫单位,默认单位是毫秒。当 scan 为 true 时,此属性失效。默认的工夫距离为 1 分钟。
- 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 进行交互:RollingPolicy,TriggeringPolicy,次要子标签: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 区别
- encoder:次要工作有两个:①将一个 event 事件转换成一组 byte 数组,②将转换后的字节数据输入到文件中。
- encoder 组件是在 0.9.19 版本之后才引进来的。在以前的版本中,appender 是应用 layout(将一个 event 事件转换成一个字符串),而后应用【java.io.writer】对象将字符串写入到文件中。
- 自从 0.9.19 版本之后,Fileappender 和他的子类是冀望应用 encoder,不再应用 layout。
- 其中 layout 仅仅实现了将一个 event 事件转换成一个字符串这一个性能。此外,layout 不能管制将字符串写出到文件。layout 不能整合 event 事件到一组中。与 encoder 相比,不仅仅能依照格局进行转化,而且还能将数据写入到文件中。
因为 layout 曾经不再举荐应用了,那么这里重点讲一下 encoder。
其中 patternLayoutEncoder 是最常应用 encoder,也就是默认的,默认就是 PatternLayoutEncoder 类,他蕴含可 patternLayout 大部分的工作。
几个重要的 encoder
-
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 接入量。
- 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