【Logback】Logback 的配置文件

目录

一、初始化配置文件

1、logback 配置文件的初始化顺序

2、logback 内部状态信息

二、配置文件的结构

1、logger 元素

2、root 元素

3、appender 元素

三、配置文件中的变量引用

1、如何定义一个变量

2、为变量设置默认值

3、变量的嵌套


    In symbols one observes an advantage in discovery which is greatest when they express the exact nature of a thing briefly and, as it were, picture it; then indeed the labor of thought is wonderfully diminished.

        —GOTTFRIED WILHELM LEIBNIZ

        大致意思是:使用符号的最大优势,就是符号可以非常清晰、简洁的描绘一个事务的本质,从而可以极大的减少思想劳动的支出。

//我把这段文字贴在这里,因为它阐释了配置文件的本质

        Logback 的配置依赖于 Joran 配置框架,这个框架后边如果有时间我会扒一下源码后再进行分享,此处,重点探讨 Logback 配置文件的相关内容。

一、初始化配置文件

1、logback 配置文件的初始化顺序

        首先让我们来看一下 logback 尝试加载配置时所遵循的初始化步骤:

        (1)查找自定义的 Configurator

        Logback 会优先加载自定义的配置器(Configurator),所谓自定义配置器,就是实现了 ch.qos.logback.classic.spi.Configurator 接口的类。

        Logback 中提供了两个 Configurator 接口的实现类,一个是 DefaultJoranConfigurator(加载logback.xml文件的配置器),另一个是 BasicConfigurator(默认配置器)。

        (2)实例化 SerializedModelConfigurator 配置器

        如果在 Logback 没有找到用户提供的自定义配置器,logback 将实例化一个 SerializedModelConfigurator。这是一个序列化模型文件的加载器,加载的文件名称为:"logback-test.scmo" 或 "logback.scmo"。

        序列化模型文件的配置执行速度更快,并且不需要任何 XML 库。与 GraalVM 结合使用,可以产生更小的可执行文件,启动速度更快。这个加载器我在 Logback 的核心包中没有找到对应的类,所以暂时不深入分析,了解即可。

        如果找不到序列化配置模型文件,SerializedModelConfigurator 将返回一个执行状态,要求调用下一个可用的配置器,即创建并调用 DefaultJoranConfigurator 的实例。

        (3)执行 DefaultJoranConfigurator 配置器(重点步骤)

        首先,DefaultJoranConfigurator 会尝试查找 “logback.configurationFile” 系统属性上指定的文件。如果可以找到该文件,则会读取并解释该文件,然后进行配置。

        如果没有找到上述文件,DefaultJoranConfigurator 将尝试在类路径上查找配置文件 “logback-test.xml” 。如果可以找到该文件,则会读取并解释该文件,然后进行配置。

        如果没有找到上述文件,配置器将继续尝试在类路径中查找配置文件 “logback.xml” 。如果可以找到该文件,则会读取并解释该文件,然后进行配置。

        如果找不到配置文件,DefaultJoranConfigurator 将返回一个执行状态,要求调用下一个可用的配置器,即创建并调用 BasicConfigurator 的实例。

        //从这里可以看出,“logback-test.xml” 文件优先于 “logback.xml” 文件生效。

        (4)执行 BasicConfigurator 配置器(使用默认配置)

        如果上述配置文件查找均不成功,logback-classic 将使用 BasicConfigurator 进行自身配置,默认配置会使日志定向输出到控制台。执行 BasicConfigurator 配置器,是为了在没有配置文件的情况下,logback 能够正常使用日志记录功能。//默认配置的作用

        //从 logback 配置文件加载过程来看,就是使用了一串配置器链(责任链模式)

2、logback 内部状态信息

        之前在《如何在项目中快速引入Logback日志?》这篇文章中提到过如何打印 logback 的内部状态信息, 这些信息在对 logback 相关的问题进行诊断时非常有用。文章中,我们使用程序代码的方式对状态信息进行打印,除此之外,还可以使用配置文件的方式。

        使用配置文件,本质上就是在配置文件中配置一个状态监听器(StatusListener),如果我们只是想把内部信息打印在控制台上,那么就可以配置一个 OnConsoleStatusListener,配置信息如下:

<configuration><!-- 建议: 将状态侦听器置于配置文件的顶部 --><statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /><!-- ... 配置文件的剩余部分 --></configuration>

        为什么建议将状态侦听器置于配置文件的顶部呢?

        这是因为,已注册的状态侦听器将仅接收其注册后的状态事件。它不会接收之前的消息。因此,最好将状态侦听器注册指令放置在配置文件顶部的其他指令之前。

        此外,配置 OnConsoleStatusListener 还有一种更简洁的方式,直接在 <configuration> 标签中,将 debug 属性设置为 true 就可以注册 OnConsoleStatusListener,如下所示:

<configuration debug="true"><!-- ... 配置文件内容部分 --></configuration>

二、配置文件的结构

        logback 的配置文件非常灵活,且不需要使用 DTD 文件或 XML 模式指定的语法。其配置文件的基本结构可以描述为:<configuration> 元素,包含零个或多个 <appender> 元素,后边可以跟零个或多个 <logger> 元素,最后最多跟随一个 <root> 元素。下图说明了这个基本结构。

        logback.xml 配置文件的一般格式内容如下:

<configuration debug="true"> <!--configuration 标签--><!--1、appender 标签--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!--2、logger 标签--><logger name="self4.Example" level="INFO" additivity="false"><!--注意:当additivity="true"时可能会重复添加--><!--当与root重复添加时,日志会被打印两次,因为有两个一样的appender--><appender-ref ref="STDOUT" />  </logger><!--3、root 标签--><root level="debug"><appender-ref ref="STDOUT"/></root></configuration> 

1、logger 元素

        顾名思义,<logger> 元素就是用来配置 logger 的标签<logger> 标签只有三个属性,分别为:name(记录器限定名),level(日志级别),additivity(是否追加)。此外,<logger> 元素可以包含零个或多个 <appender-ref> 元素;该元素可以将 appender 添加到指定的记录器中。

        其配置示例,可以参考上边 logback.xml 配置文件的一般格式的内容。

        使用 <logger> 标签可以分别对不同的 logger 设置不同的 level 级别,如果不设置 <logger> 标签,那么所有的 logger 都会继承根 logger 的配置,也就是 <root> 标签的配置。

        有关 logger 继承的详细内容,我在这篇文章《Logback 日志框架的架构》中有介绍,可做参考。

2、root 元素

        <root> 元素用来配置根记录器(root logger),该标签只支持单一属性的 level 属性

        因为根记录器是最顶层的记录器,所以它没有可追加属性(additivity),同时,根记录器已经被命名为 “ROOT”,因此它也不允许使用名称属性(name)。此外,<root> 元素可以包含零个或多个 <appender-ref> 元素;该元素可以将 appender 添加到根记录器中。

3、appender 元素

        <appender> 元素用来配置 appender,该标签有两个强制属性 name 和 class。所谓强制就是必须要配置的意思,其中 name 用来指定 appender 的名称,class 用来指定要实例化的 appender 类的完全限定名称。

        <appender> 元素可以包含零个或一个 <layout> 元素、零个或多个 <encoder> 元素以及零个或多个 <filter> 元素。除了这三个公共元素之外,<appender> 元素还可以包含与 appender 类的 JavaBean 属性相对应的任意数量的元素。//也就是说Appender实例中的一些属性也可以在配置文件中进行配置

        下图说明了<appender> 元素常见的结构。

        <layout> 元素采用强制的 class 属性,要求必须指定要实例化的布局类的完全限定名称。与 <appender> 元素一样,<layout> 可以包含与布局实例的属性相对应的其他元素。由于 <layout> 元素经常被配置,所以如果布局类是 PatternLayout,则可以根据默认的类映射规则省略 class 属性//指定字符串的打印格式

        <encoder> 元素也采用强制的 class 属性,同 <layout> 元素一样,它也具有默认的映射,如果编码器类是 PatternLayoutEncoder,则可以按照默认的类映射规则省略 class 属性

        简要的示例配置内容如下所示:

<configuration><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>myApp.log</file><encoder><pattern>%date %level [%thread] %logger{10} [%file:%line] -%kvp- %msg%n</pattern></encoder></appender><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%kvp %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="FILE" /><appender-ref ref="STDOUT" /></root>
</configuration>

三、配置文件中的变量引用

        与许多脚本语言一样,logback 配置文件也支持对变量进行定义和引用。变量可以定义在配置文件的内部,也可以定义在配置文件的外部(不推荐),甚至还可以动态的进行计算和定义。

        引用一个变量,可以使用 "${name}" 这种格式,"${name}" 会被解释为对 name 的属性值的引用。

1、如何定义一个变量

        由于历史原因,在配置文件中定义一个变量,logback 1.0.7 版本之前使用  <property> 标签,logback 1.0.7 及以后的版本中可以使用 <variable> 标签,当然也可以使用  <property> 标签(兼容性)。

        在配置文件中定义变量的内容如下:

<configuration><!--定义一个变量,变量名称为USER_HOME --><variable name="USER_HOME" value="/home/sebastien" /><appender name="FILE" class="ch.qos.logback.core.FileAppender"><!--引用定义的变量--><file>${USER_HOME}/myApp.log</file><encoder><pattern>%kvp %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="FILE" /></root>
</configuration>

        如果想将变量定义在外部文件中,可以使用如下配置:

<configuration><!--引入外部文件--><variable file="src/main/java/chapters/configuration/variables1.properties" /><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>${USER_HOME}/myApp.log</file> <!--引入外部文件中的USER_HOME变量值--><encoder><pattern>%kvp %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="FILE" /></root>
</configuration>

        外部文件 variables1.properties 中的内容如下://键值对

USER_HOME=/home/sebastien

2、为变量设置默认值

        在某些情况下,如果变量未被声明或者它的值为 null 时,则可能希望变量具有默认值。在 logback 配置中,可以使用 " :- " 运算符来指定默认值,比如,名为 name 的变量没有被定义,那么 "{name:-golden}" 将被解释为 "golden"

3、变量的嵌套

        logback 的配置完全支持变量的嵌套。变量的名称、默认值和值的定义都可以引用其他变量。

        变量值的定义可以包含对其他变量的引用,比如:

#定义的变量
USER_HOME=/home/sebastien
fileName=myApp.log#该变量值的定义可以引用其他变量
destination=${USER_HOME}/${fileName} 

        变量名称的定义也可以包含对其他变量的引用,比如,如果为名为 "userid" 的变量的值为:"swadian",则 "${${userid}.password}" 引用是变量名为 "swadian.password" 的值。

        变量默认值的定义同样也可以包含对其他变量的引用,例如,如果变量 "id" 未被分配值,并且变量 "userid" 的值为 "swadian",则表达式 "${id:-${userid}}" 将返回 "swadian"。

        当然,logback 配置中还有许多值得探讨的内容,但因为时间和篇幅有限,我们只探讨了一些常用的配置项,其他详细内容可以点击此处查阅官方文档。

        至此,全文结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/504385.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-security 项目实战(一)个人健康档案

spring-security 项目实战&#xff08;一&#xff09;个人健康档案 项目说明项目地址框架信息 代码分析配置类解析默认登录页登录接口执行逻辑登录认证成功之后重定向到main页面过程未登录之前访问 /main生成默认登录页点击登录 登录之后访问 /main执行流程清空认证信息 项目来…

SpringCloud微服务技术栈-什么是Docker?怎么安装Docker?

初识Docker以及常见技术及其概念概述 1、项目部署存在的问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题: 依赖关系复杂&#xff0c;容易出现兼容性问题 开发、测试、生产环境有差异 Docker如何解决大型项目依赖关系复杂&#xff0…

MySQL进阶:视图存储过程存储函数触发器

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;MySQL进阶&#xff1a;大厂高频面试——各类SQL语句性能调优经验 &#x1f4da;订阅专栏&#xff1a;MySQL进阶 希望文章对你们有…

【一竞技】DOTA2-梦幻联赛S22:XG战队 2-1击败 Spirit

在3月1日晚上进行的梦幻联赛第二阶段小组赛上,XG 战队以2-1 击败Spirit战队。双方对阵第三场决胜局:XG前中期优势,冰连续控盾压制最终拿下了比赛胜利,以下是对决战报。 XG战队在天辉,阵容是小狗、火女、人马、墨客、凤凰。Spirit战队在夜魇,阵容是斯温、火枪、龙骑、白虎、飞机…

【解决(几乎)任何机器学习问题】:交叉验证

在上⼀章中&#xff0c;我们没有建⽴任何模型。原因很简单&#xff0c;在创建任何⼀种机器学习模型之前&#xff0c;我们必须知道什么是交叉检验&#xff0c;以及如何根据数据集选择最佳交叉检验数据集。 那么&#xff0c;什么是 交叉检验 &#xff0c;我们为什么要关注它&…

手把手教你免费用Flashduty做消息通知

为什么需要消息通知&#xff1f; 如果有重要的情况发生&#xff0c;希望能通过各种媒介通知我们。可以举几个例子&#xff1a; 家里燃气费没有了&#xff0c;希望能有短信或者app通知api频繁500报错&#xff0c;希望及时感知&#xff0c;及时修复公司网站是https自签名证书&a…

Kubernetes(k8s第一部分)

这个技术一定会成为以后企业技术的标准 尙硅谷的王阳这个部分这个讲的特别好&#xff0c;可以自己去看 1&#xff0c;发展经历 阿里云iaas Infrastructure as a Service 平台及服务paas新浪云 platform as a service(号称免运维)&#xff08;docker是下一代的标准&#x…

MySQL 用了哪种默认隔离级别,实现原理是什么?

MySQL 的默认隔离级别是 RR - 可重复读&#xff0c;可以通过命令来查看 MySQL 中的默认隔离级别。 RR - 可重复读是基于多版本并发控制&#xff08;Multi-Version Concurrency Control&#xff0c;MVCC &#xff09;实现的。MVCC&#xff0c;在读取数据时通过一种类似快照的方…

自测-3 数组元素循环右移问题

文章预览&#xff1a; 题目算法python代码 题目 算法 解题思路:这种循环题有一个经典的O(N)解法&#xff0c;就是前后对称交换&#xff0c;举例&#xff0c;我要循环右移 123456 的后俩个&#xff0c;我们的算法是将56&#xff0c;变成65&#xff0c;把前面的1234变成4321,然后…

YOLOV8介绍

原文链接&#xff1a; 1、 详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出 2、Yolov8的详解与实战 3、YOLOV8模型训练部署&#xff08;实战&#xff09;&#xff08;&#xff09;有具体部署和训练实现代码YOLOV8模型训练部署&#xff08;实战&#xff09;&…

​魏牌高山 MPV,实用「出」价值

最近车圈里的消息不少&#xff0c;不是高合汽车摇摇欲坠&#xff0c;就是苹果停止造车&#xff0c;亦或是小米汽车遭到吉利围攻。 令人唏嘘的同时&#xff0c;也不难发现&#xff0c;现在的新能源汽车市场&#xff0c;完全一副风雨欲来的景象。 没错&#xff0c;新能源汽车市…

罐头鱼AI传单功能操作说明|二次剪辑创作|AI智剪|批量剪辑视频

罐头鱼AI传单功能操作说明 1. 首页显示 账号登录状态 可绑定账号数量 已绑定账号数量 已绑定账号显示 显示最近上传视频素材 显示新上传素材列表 QQ:290615413 2. 抖音账号绑定功能 显示登录账号 已绑定账号 可绑定账号数量 可授权绑定抖音账号 3. 账号管理列表 显…