当前位置: 首页 > article >正文

Logback日志框架中的继承机制详解

在Logback框架中,logger的继承机制是基于层级结构(hierarchical context)工作的。每个logger都被分配一个名称,这个名称可以看作是一个路径或目录结构,从而形成了一个逻辑上的树状结构。这种结构使得日志记录具有很强的灵活性和可控性。

Logger 层级结构

  1. 根Logger (root logger)

    • 根logger是所有logger的祖先,它没有名称,通常通过<root>标签来配置。
    • 每个应用程序至少有一个root logger,并且它是唯一不需要显式命名的logger。
    • 如果某个logger没有定义特定的日志级别,它会继承root logger的日志级别。
  2. 命名Logger

    • 除了root logger之外的所有logger都是命名logger,它们的名字通常是类、包或者自定义的字符串。
    • 命名logger按照点号(.)分隔成多个部分,例如com.example.service,其中com是顶级节点,examplecom的子节点,serviceexample的子节点。

继承规则

  • 日志级别继承

    • 如果一个logger没有显式设置自己的日志级别,那么它将继承其最近的父级logger的日志级别。最终,如果追溯到root logger,而root logger也没有设置日志级别,则默认使用DEBUG级别(具体取决于框架版本和配置)。
  • Appender继承

    • 默认情况下(即additivity=true),一个logger的日志事件不仅会被自己配置的appender处理,还会被传递给它的所有祖先logger,直到root logger,由这些祖先logger配置的appender再次处理。
    • 如果一个logger设置了additivity=false,那么它的日志事件只会被自己配置的appender处理,不会传递给任何祖先logger。

示例

假设你有如下的logback配置:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- appender configuration -->
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE"/>
    </root>

    <logger name="com.example" level="DEBUG"/>
    
    <logger name="com.example.service" level="TRACE" additivity="false">
        <appender-ref ref="FILE"/>
    </logger>
</configuration>

在这个例子中:

  • root logger的日志级别为INFO,并且有一个FILE类型的appender。
  • com.example logger的日志级别为DEBUG,但是它没有自己的appender,所以它会继承root logger的appender。
  • com.example.service logger的日志级别为TRACE,并且它有自己的appender,同时它的additivity属性被设置为false,这意味着它的日志信息不会被传递给com.example或root logger,只会在它自己的appender中处理。

通过这样的层级结构和继承规则,Logback允许开发者精细地控制不同包、类或组件的日志输出行为,确保应用的日志系统既灵活又高效。


http://www.kler.cn/a/452158.html

相关文章:

  • 【论文阅读笔记】IC-Light
  • RPA系列-uipath 学习笔记3
  • 代码随想录Day37 动态规划:完全背包理论基础,518.零钱兑换II,本周小结动态规划,377. 组合总和 Ⅳ,70. 爬楼梯(进阶版)。
  • More Effective C++之技术Techniques,Idioms,Patterns_条款26-27
  • 如何识别钓鱼邮件和诈骗网站?(附网络安全意识培训PPT资料)
  • 机器学习基础 衡量模型性能指标
  • 学习postman工具使用
  • 头歌-机器学习在 NLP 中的实战
  • Github 2024-12-25C开源项目日报 Top8
  • HTTP 协议、AJAX - 异步网络请求及跨域、同源策略
  • LabVIEW软件项目设计方案如何制定
  • 构建专属AI知识库:Obsidian Copilot + 硅基流动SiliconCloud API 实战指南
  • 汽车消费新旺季到来,联众优车年末冲刺把好服务关
  • 静态断言(Static Assertions)在 C++ 中的使用
  • PHP爬虫类的并发与多线程处理技巧
  • Sublime 安装 View in Browser 插件后,点击无反应的解决方法
  • linux命令中cp命令-rf与-a的差别
  • HTTP/2与HTTP1.X的对比及升级指南
  • win11+matlab2021a配置C-COT
  • 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
  • MySQL HA 方案 MMM、MHA、MGR、PXC 对比
  • Hive SQL 窗口函数 `ROW_NUMBER() ` 案例分析
  • PCA降维MATLAB代码解释及应用场景
  • 如何在 Ubuntu 22.04 上安装和使用 Composer
  • 《解锁分类神经网络预训练模型的奇妙世界》
  • uniapp input苹果中文键盘输入拼音直接切换输入焦点监听失效