目录
目前,logback 分为三个模块,logback-core、logback-classic 和 logback-access。
logback-core (核心)模块为其他两个模块奠定了基础。
logback-classic 模块扩展了 logback-core。logback-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、Appender 和 Layout。
这三中类型的组件协同工作,可以使开发人员能够根据日志级别记录日志(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 和 ERROR。 Logger X.Y 从其父级记录器 X 继承其级别值。
(2)日志打印和日志筛选
打印方法决定了请求进行日志记录的级别。例如,如果 Logger 是记录器实例,则语句 Lo