浅谈logback日志架构

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

01 引言

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

image.png

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

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

02 Logback架构

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

通过阅读文档,可以知道Logback架构分为如下几个组件。

2.1 Logger(日志记录器)

Logger是 Logback 中最基本的组件,用于记录日志消息

  • 每个 Logger 都与一个特定的名称关联,以帮助识别日志的来源,通常基于包名或类名来命名,这个名称用于标识日志记录器的来源,通常以点分隔的形式表示(例如:com.example.myapp);
  • Logger 可以配置为记录特定日志级别的消息,它定义了不同的日志级别,可以根据需要设置每个 Logger 的日志级别,只有达到或超过指定级别的日志消息才会被记录。image.png

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的类关系图:
image.png

案例可参考: 《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 在高负载情况下缓冲日志事件,以避免丢失日志消息。

这是官网的图,看得似乎不太清晰了:
image.png

备注: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日志并进行多维度分析。
目录
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
271 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
74 5
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
301 3
|
27天前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
34 1
|
2月前
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
39 2
|
2月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
126 1
|
3月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
175 9
|
4月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
4月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
13天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。