Logback 架构
Logback 架构
1、Logback 的架构
Logback 的基本架构足够通用,可以适用于不同情况。目前,logback 分为三个模块
- logback-core
- logback-classic
- logback-access
- core模块为其他两个模块奠定了基础。
- classic模块扩展了core。classic 模块对应于显著改进的 log4j 版本。Logback-classic 原生实现了SLF4J API *,*因此您可以轻松地在 logback 和其他日志系统(如 JDK 1.4 中引入的 log4j 或 java.util.logging (JUL))之间来回切换。
- 第三个模块access与 Servlet 容器集成以提供 HTTP 访问日志功能。单独的文档介绍了access 模块文档。
2、记录器、附加器和布局
Logback 建立在三个主要类之上:
Logger
Appender
Layout
这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式和报告位置。
类Logger
是 logback-classic 模块的一部分。另一方面,Appender
和 Layout
接口是 logback-core 的一部分。作为通用模块,logback-core 没有 logger 的概念。
2.1、记录器上下文
任何日志 API 相对于普通 API 的首要优势 System.out.println
在于它能够禁用某些日志语句,同时允许其他日志语句不受阻碍地打印。此功能假设日志空间(即所有可能的日志语句的空间)根据开发人员选择的一些标准进行分类。在 logback-classic 中,这种分类是记录器固有的一部分。每个单独的记录器都附加到一个LoggerContext
负责制造记录器并将其排列成树状层次结构的组件。
2.2、有效级别又称级别继承
可以为记录器分配级别。可能的级别集(TRACE、DEBUG、INFO、WARN 和 ERROR)在类中定义 ch.qos.logback.classic.Level
。请注意,在 logback 中,Level
类是最终的,不能被子类化,因为对象形式存在更灵活的方法Marker
。
给定记录器L的有效级别等于其层次结构中的第一个非空级别,从 L本身开始并沿层次结构向上朝向根记录器进行。
为了确保所有记录器最终都能继承一个级别,根记录器始终具有指定级别。默认情况下,此级别为 DEBUG。
下面是四个具有不同分配级别值的示例,以及根据级别继承规则产生的有效(继承)级别。
示例 1
如果包路径 root(如:com.jin ) 指定级别 为 debug ,如果子包 (如:com.jin.entity、com.jin.service.impl) 未指定级别,默认继承 为debug
如下所示:只有根记录器被分配了级别。此级别值
DEBUG
会被其他记录器继承 如:X
,X.Y
并且X.Y.Z
记录器名称 | 指定级别 | 有效水平 |
---|---|---|
root | DEBUG | DEBUG |
X | none | DEBUG |
X.Y | none | DEBUG |
X.Y.Z | none | DEBUG |
示例二
所有记录器都分配有级别值。级别继承不起作用。
记录器名称 | 指定级别 | 有效水平 |
---|---|---|
root | ERROR | ERROR |
X | INFO | INFO |
X.Y | DEBUG | DEBUG |
X.Y.Z | WARN | WARN |
示例三
最近原则
记录器
root
、X
和分别X.Y.Z
被分配了级别DEBUG
、INFO
和ERROR
。记录器X.Y
从其父级 继承其级别值X
。
记录器名称 | 指定级别 | 有效水平 |
---|---|---|
root | DEBUG | DEBUG |
X | INFO | INFO |
X.Y | none | INFO |
X.Y.Z | ERROR | ERROR |
示例 4
记录器
root
和X
和分别被分配了级别DEBUG
和INFO
。记录器X.Y
和X.Y.Z
从其最近的父级X
(已分配级别)继承其级别值。
记录器名称 | 指定级别 | 有效水平 |
---|---|---|
root | DEBUG | DEBUG |
X | INFO | INFO |
X.Y | none | INFO |
X.Y.Z | none | INFO |
2.3、日志级别
根据定义,打印方法决定了日志请求的级别。例如,如果L
是日志记录器实例,则该语句L.info("..")
是 INFO 级别的日志记录语句。
如果日志记录请求的级别高于或等于其记录器的有效级别,则称其为已启用。否则,该请求被称为已**禁用。如前所述,未指定级别的记录器将从其最近的祖先那里继承一个级别。此规则总结如下。
基本选择规则
如果p >= q ,则启用 向具有有效级别q的记录器发出的级别p的日志请求。
TRACE < DEBUG < INFO < WARN < ERROR
。
用更直观的方式说明选择规则的工作方式。在下表中,垂直标题显示日志请求的级别,用p指定,而水平标题显示记录器的有效级别,用q指定。行(级别请求)和列(有效级别)的交集是基本选择规则产生的布尔值。
请求级别 | effective level q | |||||
---|---|---|---|---|---|---|
p | DEBUG | INFO | WARN | ERROR | OFF | |
TRACE | YES | NO | NO | NO | NO | NO |
DEBUG | YES | YES | NO | NO | NO | NO |
INFO | YES | YES | YES | NO | NO | NO |
WARN | YES | YES | YES | YES | NO | NO |
ERROR | YES | YES | YES | YES | YES | NO |