【Logback】Logback 的配置文件

news2024/9/23 1:27:19

目录

一、初始化配置文件

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.coloradmin.cn/o/1484060.html

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

相关文章

Vue开发实例(七)Axios的安装与使用

说明&#xff1a; 如果只是在前端&#xff0c;axios常常需要结合mockjs使用&#xff0c;如果是前后端分离&#xff0c;就需要调用对应的接口&#xff0c;获取参数&#xff0c;传递参数&#xff1b;由于此文章只涉及前端&#xff0c;所以我们需要结合mockjs使用&#xff1b;由于…

基于CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

EasyRecovery16电脑硬盘数据恢复软件功能详解

在数字化时代&#xff0c;人们在日常生活和工作中越来越依赖于电脑和移动设备。不管是个人用户还是企业&#xff0c;数据的重要性都不言而喻。然而&#xff0c;数据丢失和损坏的风险也随之增加&#xff0c;因此&#xff0c;数据恢复软件的需求也日益增长。 EasyRecovery 16是一…

小程序和页面生命周期详解

目录 小程序的生命周期 创建&#xff08;onLoad&#xff09;&#xff1a; 显示&#xff08;onShow&#xff09;&#xff1a; 隐藏&#xff08;onHide&#xff09;&#xff1a; 卸载&#xff08;onUnload&#xff09;&#xff1a; 错误监听&#xff08;onError&#xff09;…

数据分析-Pandas数据的探查面积图

数据分析-Pandas数据的探查面积图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

【深入了解设计模式】组合设计模式

组合设计模式 组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成树状结构来表现“整体-部分”关系。组合模式使得客户端可以统一对待单个对象和组合对象&#xff0c;从而使得代码更加灵活和易于扩展。 概述 ​ 对于这个图片肯定会非常熟悉&#xff0c;上图我们可…

python 基础知识点(蓝桥杯python科目个人复习计划57)

今日复习计划&#xff1a;做题 例题1&#xff1a;笨笨的机器人 问题描述&#xff1a; 肖恩有一个机器人&#xff0c;他能根据输入的指令移动相应的距离。但是这个机器人很笨&#xff0c;他永远分不清往左边还是往右边移动。肖恩也知道这一点&#xff0c;所以他设定这个机器人…

红外电力设施检测数据集

需要的同学私信联系&#xff0c;推荐关注上面图片右下角的订阅号平台 自取下载。 红外检测技术目标检测准确、速度快、涵盖面积广&#xff0c;可以在不停电、不接触、不解体、不采样的状态下&#xff0c;对带电设备的状态进行检测和诊断&#xff0c;精确查找出设备的劣化程度、…

springboot+vue小区物业管理系统

摘 要 随着我国经济发展和城市开发&#xff0c;人们对住房的需求增大&#xff0c;物业管理也得到了发展。但是&#xff0c;基于人工的物业管理仍然是现阶段我国大部分物业管理公司的管理模式&#xff0c;这种管理模式存在管理人员效率低下、工作难度大的问题&#xff0c;同时…

SpringCloudAlibaba介绍

Spring Cloud Alibaba Spring Cloud Alibaba 是什么&#xff1f;微服务全景图核心特色 大家好&#xff0c;我叫阿明。下面我会为大家准备Spring Cloud Alibaba系列知识体系&#xff0c;结合实战输出案列&#xff0c;让大家一眼就能明白得技术原理&#xff0c;应用于各公司得各…

用冒泡排序模拟C语言中的内置快排函数qsort!

目录 ​编辑 1.回调函数的介绍 2. 回调函数实现转移表 3. 冒泡排序的实现 4. qsort的介绍和使用 5. qsort的模拟实现 6. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#xff0c;别忘了给个免…

Windows批处理:bat文件学习

目录 第一章、快速了解Windows批处理1.1&#xff09;Windows批处理相关概念介绍1.1.1&#xff09;批处理的起源1.1.2&#xff09;bat文件介绍 1.2&#xff09;Demo1.2.1&#xff09;创建文件添加命令1.2.2&#xff09;bat脚本中的命令解释 第二章、实例2.1&#xff09;点击bat文…

排序——手撕快排

本节复习快速排序&#xff0c; 快排我们要讲三个版本&#xff1a;一种是霍尔大佬的原版版本&#xff0c; 也就是快速排序的原版。 一种挖坑法。还有一种前后指针法。 首先我们应该知道&#xff0c;三个版本针对的是单趟进行排序的方法不同。 而多趟使用的是递归或者非递归模拟…

Carla自动驾驶仿真九:车辆变道路径规划

文章目录 前言一、关键函数二、完整代码效果 前言 本文介绍一种在carla中比较简单的变道路径规划方法&#xff0c;主要核心是调用carla的GlobalRoutePlanner模块和PID控制模块实现变道&#xff0c;大体的框架如下图所示。 一、关键函数 1、get_spawn_point(),该函数根据指定r…

360文件夹(窗口标签化工具)使用:windows系统的文件管理标签化

软件介绍 360 文件夹是一款单窗口多标签的资源管理器&#xff0c;提高了用户使用各类文件夹操作效率。单窗口多标签&#xff0c;像浏览器一样用多标签管理每个文件夹&#xff0c;以便更加快速高效地切换文件夹&#xff0c;告别凌乱的窗口&#xff0c;加快办公效率&#xff1b;…

剑指offer面试题28:对称的二叉树

#试题28&#xff1a;对称的二叉树 题目&#xff1a; 请设计一个函数判断一棵二叉树是否 轴对称 。 示例 1&#xff1a; 输入&#xff1a;root [6,7,7,8,9,9,8] 输出&#xff1a;true 解释&#xff1a;从图中可看出树是轴对称的。示例 2&#xff1a; 输入&#xff1a;root …

ssm个人学习01

Spring配置文件: spring环境的搭建: 1:导入对应的spring坐标 也就是依赖 2:编写controller, service, dao相关的代码 3:创建配置文件(在resource下面配置文件) 例如:applicationContext.xml <bean id "" class ""> <property name "&…

SQL窗口函数, 测试题

第一题 create table user_score (logday date, -- 考试时间 userid VARCHAR(20), -- 考试用户 score int); -- 考试成绩Insert into user_score values (2019-10-20,11111,85) ,(2019-10-20,22222,83) ,(2019-10-20,33333,86) ,(2019-10-21,11111,87) ,(2019-10-2…

node 之 http模块

1.什么是http模块 在网络节点中&#xff0c;负责消费资源的电脑叫做客户端&#xff1b;负责对外提供网络资源的电脑&#xff0c;叫做服务器 http模块是node.js官方提供的&#xff0c;用来创建web服务器的模块&#xff0c;通过http模块提供的http.createServer()方法&#xff0c…

烧脑问题解决办法:如何选择一款合适自己的手机流量卡

现在社会人们越来越离不开手机了&#xff0c;手机给我们生活带来了翻天覆地的变化&#xff0c;手机需要最多的就是流量了&#xff0c;所以选择一款合适自己的手机流量卡就显得尤为重要了&#xff0c;今天小编就给大家来分享一下我的经验&#xff0c;希望对大家能有帮助&#xf…