【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.mzph.cn/news/712022.shtml

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

相关文章

如何压缩word文档中的图片大小?一键批量压缩~

在日常工作和学习中&#xff0c;我们经常需要创建和编辑Word文档&#xff0c;并在其中插入图片来丰富内容。然而&#xff0c;随着图片的增加&#xff0c;Word文档的大小可能会急剧增加&#xff0c;导致文件变得庞大&#xff0c;不便于传输和共享。针对这个问题&#xff0c;本文…

67-箭头函数,new.target,模版字符串

1.箭头函数 ES6新增语法&#xff0c;用来简化函数的书写()>{} <script>//箭头函数的基本使用let a (a,b)>{return ab;}let c a(1,2);console.log(c);//输出3</script> 2.简写形式&#xff1a; 2.1参数&#xff1a;只有一个参数时可以省略小括号a>{}&…

面试经典 150 题 ---- 轮转数组

面试经典 150 题 ---- 轮转数组 轮转数组方法一&#xff1a;使用额外的数组方法二&#xff1a;数组翻转 轮转数组 方法一&#xff1a;使用额外的数组 我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度&#xff0c;我们遍历原数组&#xff0c;将原数组…

【算法】长短期记忆网络(LSTM,Long Short-Term Memory)

这是一种特殊的循环神经网络&#xff0c;能够学习数据中的长期依赖关系&#xff0c;这是因为模型的循环模块具有相互交互的四个层的组合&#xff0c;它可以记忆不定时间长度的数值&#xff0c;区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。 原理 黄…

37.云原生之springcloud+k8s+GitOps+istio+安全实践

云原生专栏大纲 文章目录 准备工作项目结构介绍配置安全测试ConfigMapSecret使用Secret中数据的方式Deployment使用Secret配置Secret加密 kustomize部署清单ConfigMap改造SecretSealedSecretDeployment改造Serviceistio相关资源DestinationRuleGatewayVirtualServiceServiceAc…

132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸,具有优异的反应活性和光学性能

132557-72-3&#xff0c;5-Sulfo-2,3,3-trimethyl indolenine sodium salt&#xff0c;2,3,3-三甲基-3H-吲哚-5-磺酸&#xff0c;具有优异的反应活性和光学性能&#xff0c;一种深棕色粉末 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;132557-72-3&#xff0c;5…

ROS2体系框架

文章目录 1.ROS2的系统架构2.ROS2的编码风格3.细谈初始化和资源释放4.细谈配置文件5.ROS2的一些命令6.ROS2的核心模块6.1 通信模块6.2 功能包6.3 分布式6.4 终端命令和rqt6.5 launch6.6 TF坐标变换6.7 可视化RVIZ 1.ROS2的系统架构 开发者的工作内容一般都在应用层&#xff0c;…

MySQL学习Day24—数据库的设计规范

一、数据库设计的重要性: 1.糟糕的数据库设计产生的问题: (1)数据冗余、信息重复、存储空间浪费 (2)数据更新、插入、删除的异常 (3)无法正确表示信息 (4)丢失有效信息 (5)程序性能差 2.良好的数据库设计有以下优点: (1)节省数据的存储空间 (2)能够保证数据的完整性 …

力扣138.随机链表的复制

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

《TCP/IP详解 卷一》第9章 广播和组播

目录 9.1 引言 9.2 广播 9.2.1 使用广播地址 9.2.2 发送广播数据报 9.3 组播 9.3.1 将组播IP地址转换为组播MAC地址 9.3.2 例子 9.3.3 发送组播数据报 9.3.4 接收组播数据报 9.3.5 主机地址过滤 9.4 IGMP协议和MLD协议 9.4.1 组成员的IGMP和MLD处理 9.4.2 组播路由…

可用于智能客服的完全开源免费商用的知识库项目

介绍 FastWiki项目是一个高性能、基于最新技术栈的知识库系统&#xff0c;专为大规模信息检索和智能搜索设计。利用微软Semantic Kernel进行深度学习和自然语言处理&#xff0c;结合.NET 8和MasaBlazor前端框架&#xff0c;后台采用.NET 8MasaFrameworkSemanticKernel&#xff…

【InternLM 实战营笔记】基于 InternLM 和 LangChain 搭建MindSpore知识库

InternLM 模型部署 准备环境 拷贝环境 /root/share/install_conda_env_internlm_base.sh InternLM激活环境 conda activate InternLM安装依赖 # 升级pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install str…

【大厂AI课学习笔记NO.53】2.3深度学习开发任务实例(6)数据采集

这个系列写了53期了&#xff0c;很多朋友收藏&#xff0c;看来还是觉得有用。 后续我会把相关的内容&#xff0c;再次整理&#xff0c;做成一个人工智能专辑。 今天学习到了数据采集的环节。 这里有个问题&#xff0c;数据准备包括什么&#xff0c;还记得吗&#xff1f; 数…

接口测试实战--mock测试、日志模块

一、mock测试 在前后端分离项目中,当后端工程师还没有完成接口开发的时候,前端开发工程师利用Mock技术,自己用mock技术先调用一个虚拟的接口,模拟接口返回的数据,来完成前端页面的开发。 接口测试和前端开发有一个共同点,就是都需要用到后端工程师提供的接口。所以,当…

书生·浦语大模型图文对话Demo搭建

前言 本节我们先来搭建几个Demo来感受一下书生浦语大模型 InternLM-Chat-7B 智能对话 Demo 我们将使用 InternStudio 中的 A100(1/4) 机器和 InternLM-Chat-7B 模型部署一个智能对话 Demo 环境准备 在 InternStudio 平台中选择 A100(1/4) 的配置&#xff0c;如下图所示镜像…

Spring常见面试题知识点总结(三)

7. Spring MVC&#xff1a; MVC架构的概念。 MVC&#xff08;Model-View-Controller&#xff09;是一种软件设计模式&#xff0c;旨在将应用程序分为三个主要组成部分&#xff0c;以实现更好的代码组织、可维护性和可扩展性。每个组件有着不同的职责&#xff0c;相互之间解耦…

YOLO算法

YOLO介绍 YOLO&#xff0c;全称为You Only Look Once: Unified, Real-Time Object Detection&#xff0c;是一种实时目标检测算法。目标检测是计算机视觉领域的一个重要任务&#xff0c;它不仅需要识别图像中的物体类别&#xff0c;还需要确定它们的位置。与分类任务只关注对…

【矩阵】【方向】【素数】3044 出现频率最高的素数

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 素数 矩阵 方向 LeetCode 3044 出现频率最高的素数 给你一个大小为 m x n 、下标从 0 开始的二维矩阵 mat 。在每个单元格&#xff0c;你可以按以下方式生成数字&#xff1a; 最多有 8 条路径可以选择&#xff1a;东&am…

安装 Ubuntu 22.04.3 和 docker

文章目录 一、安装 Ubuntu 22.04.31. 简介2. 下载地址3. 系统安装4. 系统配置 二、安装 Docker1. 安装 docker2. 安装 docker compose3. 配置 docker 一、安装 Ubuntu 22.04.3 1. 简介 Ubuntu 22.04.3 是Linux操作系统的一个版本。LTS 版本支持周期到2032年。 系统要求双核 C…

代码随想录 二叉树第二周

目录 101.对称二叉树 100.相同的树 572.另一棵树的子树 104.二叉树的最大深度 559.N叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 101.对称二叉树 101. 对称二叉树 已解答 简单 相关标签 相关企业 给你一…