WEBKT

告别日志迷宫:Fluent Bit + ELK/Grafana 实现高效可视化、查询与告警

46 0 0 0

为什么选择 Fluent Bit + ELK/Grafana?

准备工作:环境搭建

1. 创建 docker-compose.yml 文件

2. 创建 Fluent Bit 配置文件 (./fluent-bit/fluent-bit.conf)

3. 创建 Fluent Bit 解析器配置文件 (./fluent-bit/parsers.conf)

4. 创建 Logstash 配置文件 (./logstash/config/logstash.conf)

5. 启动 Docker Compose

6. 准备测试日志

日志可视化与查询

1. Kibana 日志查询

2. Grafana 日志可视化

告警设置

1. Kibana 告警

2. Grafana 告警

进阶技巧

1. 自定义日志格式

2. 日志关联分析

3. 性能优化

总结

大家好,我是老码农。在运维工作中,日志分析是至关重要的一环。面对海量的日志数据,如果还停留在手动 grep、tail 的阶段,那效率简直令人发指。今天,我将带你深入了解如何利用 Fluent Bit、ELK (Elasticsearch, Logstash, Kibana) 以及 Grafana 构建一套强大的日志分析和监控系统,告别日志迷宫,提升运维效率。

为什么选择 Fluent Bit + ELK/Grafana?

在介绍具体方案之前,我们先来聊聊为什么选择这套组合。

  • Fluent Bit:轻量级、高性能的日志收集器。 相比于 Logstash,Fluent Bit 占用资源更少,更适合在资源受限的环境中运行,例如容器和边缘设备。它的插件生态系统也十分丰富,支持多种输入、过滤和输出,满足各种日志处理需求。
  • ELK (Elasticsearch, Logstash, Kibana):强大的日志分析平台。
    • Elasticsearch: 分布式搜索和分析引擎,存储和索引日志数据,提供快速的查询性能。
    • Logstash: 数据处理管道,负责接收、转换和发送日志数据,是 ELK 体系中的数据搬运工。
    • Kibana: 数据可视化工具,基于 Elasticsearch 数据,提供丰富的图表、仪表盘和搜索功能,方便用户分析和监控日志。
  • Grafana:通用数据可视化和监控工具。 Grafana 支持多种数据源,包括 Elasticsearch。它提供了灵活的仪表盘和告警功能,可以帮助你监控系统状态,及时发现问题。

总的来说,Fluent Bit 负责收集日志,ELK 负责存储、索引和分析日志,Grafana 负责可视化和告警,三者协同工作,可以构建一套完整的日志管理解决方案。

准备工作:环境搭建

在开始之前,我们需要准备好相应的环境。这里我将以 Docker Compose 的方式进行演示,方便快速搭建和管理。

1. 创建 docker-compose.yml 文件

version: "3.7"
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.1
container_name: elasticsearch
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- xpack.security.enabled=false
ulimits:
memlock: # 允许锁定内存
soft: -1
hard: -1
ports:
- "9200:9200"
- "9300:9300"
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
networks:
- elk-network
logstash:
image: docker.elastic.co/logstash/logstash:8.11.1
container_name: logstash
ports:
- "5000:5000"
volumes:
- ./logstash/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
environment:
- LS_JAVA_OPTS=-Xms256m -Xmx256m
depends_on:
- elasticsearch
networks:
- elk-network
kibana:
image: docker.elastic.co/kibana/kibana:8.11.1
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
networks:
- elk-network
fluent-bit:
image: fluent/fluent-bit:2.2.3
container_name: fluent-bit
volumes:
- ./fluent-bit/fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
- ./fluent-bit/parsers.conf:/fluent-bit/etc/parsers.conf
- ./fluent-bit/log:/fluent-bit/log
depends_on:
- logstash
networks:
- elk-network
# restart: always
grafana:
image: grafana/grafana:10.2.3
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
depends_on:
- elasticsearch
volumes:
- grafana-data:/var/lib/grafana
networks:
- elk-network
volumes:
elasticsearch-data:
grafana-data:
networks:
elk-network:
driver: bridge

2. 创建 Fluent Bit 配置文件 (./fluent-bit/fluent-bit.conf)

[SERVICE]
Flush 1
Daemon Off
Log_Level info
Parsers_File parsers.conf
[INPUT]
Name tail
Tag host.log
Path /fluent-bit/log/*.log
Parser json
DB /fluent-bit/tail.db
DB.TTL 86400
[FILTER]
Name parser
Match host.log
Key_Name log
Parser json
[OUTPUT]
Name logstash
Match * # 匹配所有 tag
Host logstash
Port 5000
# TLS On
# TLS.Verify Off
  • SERVICE: 全局配置,设置刷新间隔、日志级别等。
  • INPUT: 定义日志来源。这里使用 tail 插件,监听 /fluent-bit/log 目录下的 .log 文件。Parser 指定使用 json 解析器。
  • FILTER: 定义日志过滤规则。这里使用 parser 插件,再次使用 json 解析器,确保日志格式正确。
  • OUTPUT: 定义日志输出目的地。这里使用 logstash 插件,将日志发送到 Logstash 的 5000 端口。

3. 创建 Fluent Bit 解析器配置文件 (./fluent-bit/parsers.conf)

[PARSER]
Name json
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L%z
  • PARSER: 定义 JSON 解析器,用于解析日志中的 JSON 格式数据。

4. 创建 Logstash 配置文件 (./logstash/config/logstash.conf)

input {
  tcp {
    port => 5000
    codec => json
  }
}

output {
  elasticsearch {
    hosts => [ "elasticsearch:9200" ]
    index => "fluent-bit-%{+YYYY.MM.dd}"
  }
  stdout {
    codec => rubydebug
  }
}
  • input: 接收 Fluent Bit 发送的日志数据,使用 tcp 插件,监听 5000 端口,并使用 json 编解码器。
  • output: 将日志数据输出到 Elasticsearch,并创建一个名为 fluent-bit-YYYY.MM.dd 的索引。同时,将日志输出到控制台,方便调试。

5. 启动 Docker Compose

在终端中,进入包含 docker-compose.yml 文件的目录,执行以下命令:

docker-compose up -d

这将启动 Elasticsearch、Logstash、Kibana、Fluent Bit 和 Grafana 容器。稍等片刻,待所有容器启动完毕。

6. 准备测试日志

./fluent-bit/log 目录下创建一个名为 app.log 的文件,并添加一些 JSON 格式的测试日志,例如:

{"time":"2024-01-26T10:00:00.000+0800", "level":"INFO", "message":"应用程序启动成功"}
{"time":"2024-01-26T10:01:00.123+0800", "level":"WARN", "message":"数据库连接超时", "service":"database"}
{"time":"2024-01-26T10:02:00.456+0800", "level":"ERROR", "message":"处理请求失败", "error_code":500, "request_id":"abc-123"}

Fluent Bit 会自动读取这些日志,并将其发送到 Logstash,再由 Logstash 转发到 Elasticsearch。

日志可视化与查询

现在,我们可以通过 Kibana 和 Grafana 来查看和分析日志数据了。

1. Kibana 日志查询

  • 打开浏览器,访问 http://localhost:5601,进入 Kibana 界面。
  • 点击 "Explore on my own",然后点击 "Discover"。
  • 如果一切顺利,你应该能看到 Elasticsearch 中存储的日志数据。如果没有,请检查 Logstash 和 Elasticsearch 的配置,确保日志被正确索引。
  • 在 Kibana 的 "Discover" 页面,你可以使用 KQL (Kibana Query Language) 来进行日志查询。例如:
    • level:ERROR:查询所有 level 字段值为 ERROR 的日志。
    • message:"数据库":查询 message 字段包含 "数据库" 的日志。
    • time:[2024-01-26T10:00:00 TO 2024-01-26T10:02:00]:查询指定时间范围内的日志。
  • Kibana 还支持创建可视化图表,例如柱状图、折线图、饼图等,帮助你更直观地了解日志数据。

2. Grafana 日志可视化

  • 打开浏览器,访问 http://localhost:3000,进入 Grafana 界面。默认用户名和密码都是 admin,首次登录需要修改密码。
  • 点击左侧菜单栏的 "Configuration" -> "Data sources",然后点击 "Add data source"。
  • 选择 "Elasticsearch" 作为数据源。配置 Elasticsearch 的 URL (http://elasticsearch:9200) 和索引模式 (fluent-bit-*)。测试连接,确保 Grafana 可以访问 Elasticsearch。
  • 点击左侧菜单栏的 "Dashboards" -> "New" -> "Import",导入一个现成的 Grafana 仪表盘,或者自己创建一个。
  • 如果选择导入,你可以在 Grafana 官网或者 GitHub 上找到一些 ELK 的仪表盘模板。将 JSON 格式的仪表盘导入 Grafana。
  • 如果选择创建,你可以根据自己的需求,添加各种图表和面板,例如:
    • 日志数量趋势图: 统计一段时间内不同日志级别的数量。
    • 错误日志分布图: 统计不同错误类型的分布情况。
    • 日志文本面板: 直接显示日志内容,方便查看详细信息。

通过 Grafana,你可以将日志数据与其他监控指标结合起来,构建一个更全面的监控体系。

告警设置

除了可视化和查询,告警也是日志分析的重要功能。当系统出现异常时,告警可以及时通知你,让你快速采取措施。

1. Kibana 告警

  • 在 Kibana 中,你可以创建基于 Elasticsearch 查询的告警。点击左侧菜单栏的 "Stack Management" -> "Alerts and Actions" -> "Create alert"。
  • 选择 "Elasticsearch query" 作为告警类型。配置告警的触发条件和通知方式。例如:
    • 触发条件: level:ERROR,当 level 字段值为 ERROR 的日志数量超过某个阈值时触发告警。
    • 通知方式: 发送邮件、Slack 消息、Webhook 等。

2. Grafana 告警

  • 在 Grafana 中,你可以创建基于查询结果的告警。进入你创建的仪表盘,点击面板右上角的 "Edit" -> "Alert"。
  • 配置告警的触发条件和通知方式。例如:
    • 触发条件: 查询 Elasticsearch 数据,当 level 字段值为 ERROR 的日志数量超过某个阈值时触发告警。
    • 通知方式: 发送邮件、Slack 消息、Webhook 等。

进阶技巧

1. 自定义日志格式

在实际生产环境中,日志格式可能各不相同。你可以根据实际情况,自定义日志的格式,例如:

  • Fluent Bit 解析器:parsers.conf 文件中,你可以定义更复杂的解析规则,提取日志中的关键信息。
  • Logstash Filter:logstash.conf 文件中,你可以使用 Logstash 的 Filter 插件,例如 grokmutate 等,对日志数据进行转换和处理。

2. 日志关联分析

在复杂的应用系统中,一个请求可能涉及多个组件。为了更好地进行故障排查,你需要将不同组件的日志关联起来。

  • 添加 Request ID: 在应用程序中,为每个请求生成一个唯一的 Request ID,并将该 ID 记录在日志中。这样,你就可以通过 Request ID 将不同组件的日志关联起来。
  • 使用 ELK 的关联分析功能: Kibana 和 Grafana 都支持日志关联分析功能,你可以通过 Request ID 等字段,将相关日志串联起来,方便进行故障排查。

3. 性能优化

在处理海量日志时,性能优化至关重要。

  • Fluent Bit 优化: 调整 Fluent Bit 的配置参数,例如刷新间隔、缓冲区大小等,提高日志收集的效率。
  • Elasticsearch 优化: 优化 Elasticsearch 的索引配置,例如分片数量、副本数量等,提高查询性能。
  • Logstash 优化: 调整 Logstash 的并发处理能力,提高数据处理效率。
  • 硬件优化: 增加服务器的 CPU、内存和磁盘容量,提高系统的整体性能。

总结

通过 Fluent Bit、ELK 和 Grafana 的组合,我们可以构建一套强大的日志分析和监控系统,实现日志的可视化、查询和告警,提升运维效率和故障排查能力。当然,这只是一个基础的方案,你可以根据实际需求,进行更深入的定制和优化。希望这篇文章能帮助你更好地管理日志,祝你运维愉快!

如果你在实践过程中遇到任何问题,欢迎在评论区留言,我们一起交流学习。如果你觉得这篇文章对你有所帮助,请点赞、收藏、转发,支持一下老码农!

老码农 Fluent BitELKGrafana日志分析运维

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/7846