Skip to Content

功能

  • 构建强大的集中式日志管理和分析平台。它可以帮助开发者和运维人员有效地收集、处理、搜索、分析和可视化 Spring Boot 应用产生的日志数据

1. Elasticsearch (简称 ES)

  • 功能: Elasticsearch 是一个分布式、开源的搜索和分析引擎。它基于 Lucene 构建,以其快速的全文搜索能力而闻名。ES 擅长存储和索引大量的非结构化数据,并提供近实时的搜索和数据分析能力。
  • 在 ELK 中的角色: Elasticsearch 充当 ELK 栈的核心数据存储和搜索引擎。所有被 Logstash 处理过的日志数据最终都会被索引并存储在 Elasticsearch 中。它负责高速地存储和检索日志数据,并支持复杂的搜索查询和聚合操作。

2. Logstash

  • 功能: Logstash 是一个开源的数据收集引擎。它可以从不同的来源(例如:日志文件、数据库、消息队列等)收集数据,然后对数据进行解析、过滤、转换等处理,最后将处理后的数据输出到不同的目的地(例如:Elasticsearch, 文件, 数据库等)。
  • 在 ELK 中的角色: Logstash 在 ELK 栈中扮演日志数据处理管道的角色。在 Spring Boot 应用的日志管理中,Logstash 主要负责:
    • 收集日志: 从 Spring Boot 应用的日志文件(或者通过其他方式,例如:TCP/UDP)收集日志数据。
    • 解析日志: 将原始的文本日志数据解析成结构化的数据,例如:提取时间戳、日志级别、线程、类名、消息内容等字段。Logstash 提供了丰富的插件来解析各种日志格式,例如:Common Log Format, Grok patterns 等。
    • 过滤和转换日志: 可以根据需要过滤掉不需要的日志,或者对日志数据进行转换,例如:添加地理位置信息、丰富数据字段等。
    • 输出到 Elasticsearch: 将处理后的结构化日志数据发送到 Elasticsearch 进行索引和存储。

3. Kibana

  • 功能: Kibana 是一个开源的数据可视化和探索工具。它可以连接到 Elasticsearch,让用户可以通过友好的用户界面搜索、分析和可视化存储在 Elasticsearch 中的数据。Kibana 提供了丰富的图表类型(例如:折线图、柱状图、饼图、地图等)和仪表盘功能,方便用户创建实时的监控和分析面板。
  • 在 ELK 中的角色: Kibana 是 ELK 栈的用户界面。在 Spring Boot 日志管理中,Kibana 主要用于:
    • 日志搜索和探索: 用户可以使用 Kibana 的搜索功能来查找特定的日志信息,例如:搜索包含特定关键字的日志、搜索特定时间范围内的错误日志等。
    • 日志分析和可视化: 用户可以利用 Kibana 的聚合和可视化功能来分析日志数据,例如:统计不同日志级别的数量、分析错误日志的趋势、可视化应用性能指标等。
    • 创建仪表盘: 用户可以创建自定义的仪表盘,将关键的日志分析结果和监控指标集中展示,方便实时监控 Spring Boot 应用的运行状态。

实现

1. 配置 Spring Boot 应用的日志输出

首先,你需要配置你的 Spring Boot 应用,使其将日志输出到 Logstash 可以读取的位置。 通常,这涉及到配置日志框架(例如 Logback 或 Log4j2)将日志写入文件,或者通过网络协议(如 TCP 或 UDP)发送日志。

  • 选择日志输出目标: 常见的选择是文件输出。 你需要指定日志文件的路径和文件名。 也可以选择使用 TCP 或 UDP 输出,但这通常更复杂一些,文件输出更易于上手。
  • 配置日志格式 (重要): 为了让 Logstash 能够有效地解析日志,建议配置结构化的日志格式。 虽然 Logstash 可以解析非结构化的文本日志,但结构化日志(例如 JSON 格式)会大大简化后续的解析和处理流程。 使用 JSON 格式可以方便地提取日志字段,并进行更精确的分析。

例子 (Logback 配置 - logback-spring.xml)

假设你使用 Logback 作为 Spring Boot 的日志框架,你可以在 src/main/resources 目录下创建 logback-spring.xml 文件,并配置类似下面的内容,将日志输出到 JSON 文件:

<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/springboot-app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/springboot-app.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <!- 使用 LogstashEncoder 输出 JSON 格式 --> <jsonEncodingPattern> { "timestamp": "%timestamp", "level": "%level", "thread": "%thread", "logger": "%logger{40}", "message": "%message" } </jsonEncodingPattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> </configuration>

关键点解释:

  • net.logstash.logback.encoder.LogstashEncoder: 这个 encoder 来自 logstash-logback-encoder 依赖,你需要将其添加到你的 Spring Boot 项目的 pom.xmlbuild.gradle 文件中。它的作用是将日志消息编码为 JSON 格式。
  • <encoder class="net.logstash.logback.encoder.LogstashEncoder">:FILE appender 中,我们使用了 LogstashEncoder 来定义 JSON 输出格式。
  • <jsonEncodingPattern>: 在这个标签内,我们定义了 JSON 结构,包含了时间戳 (timestamp),日志级别 (level),线程 (thread),logger 名称 (logger) 和日志消息 (message) 等字段。你可以根据需要自定义 JSON 结构。
  • logs/springboot-app.log: 指定了日志文件的路径和文件名。

添加 logstash-logback-encoder 依赖 (Maven pom.xml 例子):

<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>版本号</version> <!- 请替换为合适的版本号,例如 7.4 --> </dependency>

2. 配置 Logstash

接下来,你需要配置 Logstash 来收集、解析和处理 Spring Boot 应用的日志数据,并将处理后的数据发送到 Elasticsearch。 Logstash 的配置通常包含三个主要部分:input, filter, 和 output

  • input (输入配置): 定义 Logstash 从哪里读取日志数据。 对于 Spring Boot 应用的文件日志,你可以使用 file 输入插件。
  • filter (过滤器配置 - 可选,但通常很有用): 定义 Logstash 如何解析和处理输入的日志数据。 如果你的 Spring Boot 应用输出了 JSON 格式的日志(如上面的例子),你可以使用 json 过滤器来解析 JSON 数据,将 JSON 字段提取出来。 如果你的日志是非结构化的文本,你可能需要使用 grok 过滤器来定义正则表达式来解析日志。
  • output (输出配置): 定义 Logstash 将处理后的数据发送到哪里。 对于 ELK 栈,你需要配置 elasticsearch 输出插件来将数据发送到 Elasticsearch。

例子 (Logstash 配置文件 logstash.conf)

假设你的 Logstash 配置文件是 logstash.conf, 你可以配置类似下面的内容:

input { file { path => "/path/to/your/logs/springboot-app.log" <-! 替换为你的 Spring Boot 日志文件路径 --> start_position => "beginning" <-! 或者 "end" 如果只想处理新增日志 --> codec => "json_lines" <-! 如果你的日志是 JSON 格式,使用 json_lines codec --> } } filter { json { source => "message" <-! 如果你的 JSON 日志消息在 "message" 字段中 --> } # 你可以添加其他的 filter,例如 grok filter 来处理更复杂的日志格式 } output { elasticsearch { hosts => ["http://localhost:9200"] <-! 替换为你的 Elasticsearch 地址 --> index => "springboot-logs-%{+YYYY.MM.dd}" <-! 定义 Elasticsearch 索引名称,可以按日期分割 --> } stdout { codec => rubydebug } <-! 可选:输出到控制台,用于调试 --> }

关键点解释:

  • input file: 使用 file 输入插件来读取文件。

    • path: 指定 Spring Boot 应用日志文件的路径。 请务必替换为你的实际日志文件路径
    • start_position: 指定 Logstash 从文件开始处 (beginning) 还是末尾 (end) 开始读取。 通常 beginning 用于首次启动,end 用于持续监控新日志。
    • codec => "json_lines": 指定使用 json_lines codec。 如果你的 Spring Boot 日志是每行一个 JSON 对象,可以使用 json_lines。 如果是普通的文本日志,可以省略 codec 或者使用其他的 codec 例如 plain。  
  • filter json: 使用 json 过滤器。

    • source => "message": 指定 JSON 数据来源的字段。 如果你的 JSON 日志消息本身就在 message 字段中 (例如上面的 Logback 配置),那么就设置为 "message"。  
  • output elasticsearch: 使用 elasticsearch 输出插件。

    • hosts: 指定 Elasticsearch 集群的地址。 请务必替换为你的 Elasticsearch 地址。 如果 Elasticsearch 运行在本地默认端口,可以使用 ["http://localhost:9200"]
    • index: 定义 Elasticsearch 索引的名称。 springboot-logs-%{+YYYY.MM.dd} 表示索引名称以 “springboot-logs-” 开头,并附加当前日期 (年.月.日) ,例如 springboot-logs-2023.10.27。 这是一种常见的按日期分割索引的方式,方便日志管理。  
  • output stdout: (可选) 使用 stdout 输出插件,将处理后的数据输出到 Logstash 的控制台。 这对于调试 Logstash 配置非常有用。 codec => rubydebug 使用 rubydebug codec 可以更详细地输出数据结构。

3. 启动 ELK 组件

确保你的 Elasticsearch, Logstash 和 Kibana 组件都已经正确安装并启动。 具体的安装和启动步骤会根据你的操作系统和部署方式而有所不同,请参考 ELK 官方文档。

  • Elasticsearch: 确保 Elasticsearch 服务正在运行,并且可以访问(例如通过 http://localhost:9200)。
  • Logstash: 启动 Logstash,并指定你创建的 logstash.conf 配置文件。 启动命令通常类似于: bin/logstash -f logstash.conf (在 Logstash 安装目录下执行)。
  • Kibana: 确保 Kibana 服务正在运行,并且可以访问(例如通过 http://localhost:5601)。 Kibana 通常会自动连接到 Elasticsearch。

4. 在 Kibana 中探索日志

一旦 Logstash 开始收集和发送 Spring Boot 应用的日志数据到 Elasticsearch,你就可以使用 Kibana 来搜索、分析和可视化这些日志了。

  • 访问 Kibana: 打开浏览器,访问 Kibana 的 Web 界面 (通常是 http://localhost:5601)。
  • 创建 Index Pattern: 首次使用 Kibana,你需要创建一个 Index Pattern 来告诉 Kibana 你要查看哪个或哪些 Elasticsearch 索引的数据。 在 “Stack Management” (或者早期的版本可能是 “Management”) -> “Index Patterns” 中,点击 “Create index pattern”。
    • Index pattern name: 输入你在 Logstash 配置中定义的 Elasticsearch 索引名称模式,例如 springboot-logs-* (使用 * 通配符匹配所有以 springboot-logs- 开头的索引)。
    • Kibana 会自动连接到 Elasticsearch 并列出匹配的索引。 选择一个时间字段(例如 @timestamp 或你自定义的时间字段),然后点击 “Create index pattern”。
  • 探索 Discover: 创建 Index Pattern 后,你可以切换到 “Discover” 页面来浏览原始日志数据。 你可以使用 Kibana 的查询语言 (KQL 或 Lucene Query Syntax) 来搜索特定的日志信息,例如:
    • 搜索包含特定关键字的日志: 在搜索框中输入关键字,例如 error
    • 搜索特定时间范围内的日志: 使用时间过滤器选择时间范围。
    • 基于字段进行搜索: 例如,搜索特定 logger 的日志: logger:com.example.demo.MyController
  • 创建 Visualize 和 Dashboard: 在 “Visualize” 和 “Dashboard” 页面,你可以创建各种图表和仪表盘来分析和可视化日志数据,例如:统计不同日志级别的数量,分析错误日志的趋势,创建应用性能监控仪表盘等等。
Last updated on