浅谈logback日志架构

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 浅谈logback日志架构

01 引言

在上一篇博客《Java日志框架整理》,大致阐述了Java常用的日志框架。

可以知道,在日志框架技术选型上,建议使用 SLF4J作为日志门面,以便能够轻松切换和配置不同的日志实现,而Logback通常是一个很好的选择作为具体的日志实现。

本文聊一下Logback日志框架的架构。

02 Logback架构

详情参考官网:https://logback.qos.ch/manual/architecture.html

通过阅读文档,可以知道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的类关系图:

案例可参考: 《Springboot 使用logback直接将日志写入Elasticsearch》

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管理,支持多种配置文件格式,提供强大的日志记录和管理功能。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
27天前
|
Java Spring
【Spring Boot】logback和log4j日志异常处理
【1月更文挑战第25天】【Spring Boot】logback和log4j日志异常处理
|
3月前
|
Java
logback为日志配置颜色
logback为日志配置颜色
QGS
|
26天前
|
Java 数据库连接 Apache
Springboot日志框架logback与log4j2
Springboot日志框架logback与log4j2
QGS
24 0
|
2月前
|
前端开发 Java
日志框架:基于Logback实现链路追踪
日志框架:基于Logback实现链路追踪
|
2月前
|
SQL druid Java
springboot +logback+阿里数据源(druid)打印sql日志以及简化日志输出方式
springboot +logback+阿里数据源(druid)打印sql日志以及简化日志输出方式
140 0
|
2月前
|
SQL druid Java
三步实现maven工程集成logback日志框架(日志按天滚动生成文件)并附源码
三步实现maven工程集成logback日志框架(日志按天滚动生成文件)并附源码
43 0
|
3月前
模拟slf4j+logback输出的日志
模拟slf4j+logback输出的日志
20 0
|
2月前
|
Java Spring
spring boot 配置log4j 日志
spring boot 配置log4j 日志
34 0
|
1月前
|
SQL Java 数据库连接
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
【1月更文挑战第2天】 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
143 3
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
|
20天前
|
监控 安全 数据库
Binlog vs. Redo Log:数据库日志的较劲【高级】
Binlog vs. Redo Log:数据库日志的较劲【高级】
56 0

相关产品

  • 云迁移中心