01 引言
在上一篇博客《Java日志框架整理》,大致阐述了Java常用的日志框架。
可以知道,在日志框架技术选型上,建议使用 SLF4J作为日志门面,以便能够轻松切换和配置不同的日志实现,而Logback通常是一个很好的选择作为具体的日志实现。
本文聊一下Logback日志框架的架构。
02 Logback架构
通过阅读文档,可以知道Logback
架构分为如下几个组件。
2.1 Logger(日志记录器)
Logger :是 Logback 中最基本的组件,用于记录日志消息。
- 每个 Logger 都与一个特定的名称关联,以帮助识别日志的来源,通常基于包名或类名来命名,这个名称用于标识日志记录器的来源,通常以点分隔的形式表示(例如:
com.example.myapp
); - Logger 可以配置为记录特定日志级别的消息,它定义了不同的日志级别,可以根据需要设置每个 Logger 的日志级别,只有达到或超过指定级别的日志消息才会被记录。
2.2 Appender(输出器)
Appender (也称为输出器):用于将日志消息输出到不同的目标,如文件、控制台、数据库等,Logback 提供了多种 Appender 类型,允许开发人员根据需要配置日志消息的输出。
常见的输出目标包括:
- ConsoleAppender:将日志事件输出到控制台;
- FileAppender:将日志事件写入文件;
- RollingFileAppender:具有日志文件滚动和归档功能的文件Appender;
- SMTPAppender:通过电子邮件发送日志事件给指定的收件人;
- SocketAppender:将日志事件通过TCP或UDP协议发送到远程主机的套接字;
- SyslogAppender:将日志事件发送到Syslog服务器,通常在Unix/Linux环境中使用;
- SlackAppender:将日志事件发送到Slack通知频道;
- LogstashSocketAppender:将日志事件发送到Logstash服务器(通过TCP或UDP);
- LogstashEncoder Appender:使用Logstash编码器将日志以JSON格式发送到Elasticsearch或Logstash;
- ElasticsearchAppender:直接将日志事件发送到Elasticsearch;
- GelfSocketAppender:将日志事件以GELF格式发送到Graylog。
这里附上相关Appender的类关系图:
2.3 Layout(消息格式)
Layout :用于定义日志消息的格式和外观(包括:时间戳、日志级别、日志内容等),将日志事件转换为字符串,以便输出到不同的日志目标(如文件、控制台、数据库等),同时也支持国际化,以便根据不同的地区或语言生成不同的日志消息。
Logback 提供了多种内置的 Layout 类型(当然也可以创建自定义的 Layout),以满足不同的日志输出需求,包括:
- PatternLayout: 使用类似于正则表达式的模式来定义日志消息格式,开发人员可以根据模式字符串来控制日志消息的外观;
- HTMLLayout: 用于生成 HTML 格式的日志消息,适用于 Web 应用程序的日志记录;
- JsonLayout: 用于生成 JSON 格式的日志消息,适用于与日志分析工具集成;
- XMLLayout: 用于生成 XML 格式的日志消息,适用于与其他系统进行数据交换。
2.4 Filters(过滤器)
Filters: 用于对日志事件进行过滤,只有符合特定条件的事件才会被记录。
常见的过滤条件包括:
- LevelFilter: 基于日志级别,可以配置只记录特定级别的日志消息,如只记录 ERROR 级别的消息。
- ThresholdFilter: 基于日志级别的阈值,可以配置只记录达到或超过某个级别的日志消息。
- LoggerFilter: 基于 Logger 的名称,可以为特定 Logger 记录日志,同时忽略其他 Logger。
- MarkerFilter: 基于日志事件的标记(Marker),可以根据自定义标记来决定是否记录日志消息。
- RegexFilter: 基于正则表达式的模式,可以匹配日志消息的内容并决定是否记录。
- AndFilter 和 OrFilter: 允许组合多个过滤条件,实现复杂的条件组合。
2.5 LoggerContext(日志配置器)
LoggerContext :是 Logback 的核心组件,负责管理和配置所有的 Logger、Appender、Layout 和 Filter。
它有如下特性:
- 唯一性:通常一个应用程序只有一个 LoggerContext 实例,它是全局的。这意味着在整个应用程序中,所有的 Logger、Appender、Layout 和 Filter 都共享同一个 LoggerContext,这有助于确保日志系统的一致性和协调性;
- LoggerFactory:LoggerContext 负责创建 Logger 实例,应用程序通常通过 LoggerFactory 来获取 Logger,LoggerFactory 会使用 LoggerContext 来创建和管理 Logger 实例;
- Logger 配置:LoggerContext 允许开发人员在应用程序中配置和管理 Logger。Logger 是记录日志消息的关键组件,通过 LoggerContext,可以为不同的包、类或模块配置不同的 Logger,以实现日志级别、Appender、Filter 和 Layout 的定制;
- 全局配置:LoggerContext 也允许进行全局配置,例如设置默认的日志级别、全局的 Layout、全局的 Filter 等,这些全局配置可以应用于所有的 Logger,但通常可以被具体的 Logger 配置所覆盖;
- 日志系统状态管理:LoggerContext 还负责管理日志系统的状态信息,例如记录配置加载情况、Appender 的启动状态、错误信息等,这些状态信息对于调试和监控日志系统非常有用;
- 重新配置:在某些情况下,应用程序可能需要在运行时重新配置日志系统。LoggerContext 允许在运行时加载新的配置文件,重新配置 Logger、Appender、Layout 和 Filter,而不需要重启应用程序。
2.6 Configuration File(配置文件)
Logback :支持通过 XML 或 Groovy 配置文件来定义日志记录的规则和配置,配置文件中包含了 Logger、Appender、Layout 和 Filter 的配置信息,以及日志级别的定义。
logback.xml配置示例如下:
<!-- logback.xml -->
<!-- Logback 配置文件的根元素 -->
<configuration>
<!-- 定义一个输出到控制台的 Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 日志消息格式化模式 -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 定义一个输出到文件的 Appender -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myapp.log</file> <!-- 指定日志文件名 -->
<encoder>
<!-- 日志消息格式化模式 -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 设置根 Logger 的日志级别为 INFO,并关联 CONSOLE 和 FILE Appender -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
2.7 Logging Event(日志事件)
Logging Event: 包含了要记录的日志相关的信息,包括消息文本、日志级别、时间戳、Logger 名称、日志线程、Marker(标记)、Throwable(异常信息)、MDC(Mapped Diagnostic Context)。
当应用程序生成日志消息时,Logback 将其封装为一个 Logging Event,并传递给适当的 Logger 进行处理。
Logging Event Queue: Logback 使用一个内部队列来管理待处理的 Logging Event,这个队列允许 Logback 在高负载情况下缓冲日志事件,以避免丢失日志消息。
这是官网的图,看得似乎不太清晰了:
备注:MDC(Mapped Diagnostic Context)是一种在日志框架中用于管理和传递上下文信息的机制,它允许开发人员将自定义的键值对信息与每个日志事件关联,这些信息可以在整个日志事件的生命周期内保持不变,并且可以在日志消息中使用。MDC 对于跟踪日志事件与特定上下文相关的信息非常有用,例如用户身份、请求标识、会话信息等,以便更好地了解和调查日志事件。
2.8 Status Manager (状态管理器)
Status Manager: 负责记录和报告 Logback 内部状态信息 记录了 Logback 配置加载、Appender 启动、Filter 和 Layout 初始化、错误信息等信息,这对于调试和监控 Logback 的运行非常有用。
03 小结
通过阅读本文,可以知道Logback是一个灵活的Java日志框架,具有清晰的架构,包括Logger、Appender、Layout和Filter等组件,通过LoggerContext管理,支持多种配置文件格式,提供强大的日志记录和管理功能。