【Logback】Logback 日志框架的架构

本文详细介绍了logback中的Logger、Appenders和Layouts组件,包括它们如何协同工作、日志级别管理和筛选、以及日志打印过程的源码解析。重点讲解了有效级别、级别继承、日志打印步骤等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、Logger(记录器)

(1)有效级别和级别继承

(2)日志打印和日志筛选

(3)记录器命名

2、Appenders(追加器)

3、Layouts(布局)

4、如何避免日志参数构建成本?

5、日志打印步骤的源码分析

(1)获取过滤器链的决策结果

(2)比较 Logger 有效级别与日志打印请求的级别

(3)创建 LoggingEvent 对象

(4)调用 Appender

(5)格式化 LoggingEvent 

(6)发送 LoggingEvent


        目前,logback 分为三个模块,logback-core、logback-classiclogback-access

        logback-core (核心)模块为其他两个模块奠定了基础。

        logback-classic 模块扩展了 logback-corelogback-classic 模块是 log4j 日志的改进版本。logback-classic 模块实现了 slf4j API,因此使用 slf4j API 时,可以轻松地在 logback 和其他日志框架之间来回切换(例如 JDK 1.4 中引入的 log4j 或 java.util.logging(JUL))。//核心+核心拓展

        logback-access 模块用于与 Servlet 容器集成,用来提供 HTTP-access 日志功能。logback-access 不能安装在 Web 应用程序级别,而是必须安装在容器级别。在 Web 应用程序级别捆绑 logback-access.jar 没有任何意义。//logback-access 模块内容暂时不进行过多深入,后续有时间再探讨

        在这篇文章中,介绍的 logback 指的都是 logback-classic 模块的内容。

        logback 有三个主要的类:Logger、AppenderLayout

        这三中类型的组件协同工作,可以使开发人员能够根据日志级别记录日志(Logger),并在运行时控制这些日志的输出位置(Appender)输出格式(Layout)

        Logger 类是 logback-classic 模块的一部分。Appender 和 Layout 接口是 logback-core 的一部分。logback-core 作为一个通用模块,并没有记录器(Logger)的概念//需要明确各个组件之间的包关系,核心只有通用功能,ogback-classic 是对核心的拓展

1、Logger(记录器)

        与普通 System.out.println 相比,Logger(记录器) 的优势在于它能够禁用某些日志语句,同时还不阻碍其他日志语句地打印。//简单的来说,就是Logger可以对日志消息进行分类打印,即日志分级

        所有的 Logger(记录器) ,都统一放置在记录器容器(LoggerContext)中,LoggerContext 负责生成 Logger 并对这些 Logger 按一定的层次进行树状排列

        什么?记录器是有层次(顺序)的吗?

        是的,你没有看错,记录器的层次与记录器的命名有关,它的层次划分的标识用的是 “.”。比如,名为 “com.foo” 的 Logger 是名为 “com.foo.Bar” 的 Logger 的父级 Logger。这就像命名为 “java” 的包既是 “java.util” 的父级包,也是 “java.util.Vector” 的父级包一样。

        为什么要对记录器进行分层呢?

        这个是有好处的,可以非常方便的支持 Logger 的日志级别和附加器的继承,这部分内容将在后边详细说明。

         对于按层次进行树状排列,我们可以第一时间想到的就是 Linux 的目录结构,在 Linux 中所有目录都是从根目录开始的。类似的,那么在 LoggerContext 中也一定有一个根记录器。

        没错,logback 中的根记录器就是位于所有记录器层次结构的顶层,它是所有记录器的父级记录器,我们可以通过名称来获取这个根记录器,代码如下所示:

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);

(1)有效级别和级别继承

        记录器可以被分配级别,比如在 ch.qos.logback.classic.Level 类中就定义了 TRACE、DEBUG、INFO、WARN 和 ERROR 这五种级别。

        此外,在 logback 中,还有一种用于对日志事件进行标记或分类的机制:Marker。它允许你对特定的日志事件添加额外的信息,以便在日志输出时更好地组织和过滤日志。//简单提一下,日常开发用得不多

        刚才说到,logback 中的记录器是分层的。所以,如果给定的记录器没有分配级别,那么它就会从其最接近的父级记录器那里继承它的级别//级别继承规则

        因此,为了确保所有记录器最终都能指定继承级别,根记录器始终具有指定的级别。默认情况下,该级别为 DEBUG//现在知道了吧,logback 的默认日志级别debug就是从这里来的

        指定级别以及根据级别继承规则生成的有效级别的示例如下:

        在上面的示例中,记录器 root、X X.Y.Z 分别被分配级别 DEBUG、INFO 和 ERRORLogger X.Y 从其父级记录器 X 继承其级别值。

(2)日志打印和日志筛选

        打印方法决定了请求进行日志记录的级别。例如,如果 Logger 是记录器实例,则语句 Lo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值