将 Syslog 数据通过 Fluent Bit 发送到 Elasticsearch

使用 Docker Compose 搭建 Fluent Bit 集中式 Syslog 收集器,通过 UDP 接收 Alpine logger 日志,并将 Syslog 数据转发到 Elasticsearch 索引中验证。

作者 Sharad Regoti

Fluent Bit 是一款被广泛使用的开源数据收集智能体、处理器和转发器,它能让你从各种来源收集日志、指标和追踪数据,对其进行过滤和转换,然后将其转发到多个目的地。

在现代基础设施中,尽管结构化JSON日志日益普及,但系统日志(Syslog)仍是网络设备、遗留应用程序和Linux发行版的标准。然而,在每台服务器上本地分析系统日志文件并非最佳实践。

在本指南中,我们将把 Fluent Bit 设置为一个集中式 Syslog 服务器,它通过 UDP(用户数据报协议)接收日志,并将其直接发送到 Elasticsearch 进行分析。

核心要点摘要

  • 本文目标是搭建一个可复现的 Syslog 到 Elasticsearch 示例链路:Alpine 容器生成 Syslog,Fluent Bit 通过 UDP 5140 接收,再写入 Elasticsearch。
  • Fluent Bit 在这个链路中承担集中式 Syslog 服务器角色,不需要在每个模拟设备上部署完整日志 Agent。
  • 示例使用 Docker Compose 组织 Fluent Bit、两个 Alpine logger 和网络环境,适合本地验证配置思路。
  • Fluent Bit 的关键配置是 syslog input 和 es output;实际使用时需要替换 Elasticsearch 的 host、用户和密码。
  • UDP Syslog 轻量但不保证投递,适合演示和部分设备日志场景;对可靠性要求高的生产链路,需要结合缓冲、重试或改用更可靠的传输方式。

先决条件

  • Docker 和 Docker Compose:已在您的系统上安装。
  • Elasticsearch:我们将把日志发送到一个 Elasticsearch 实例。要跟上操作,你需要有一个正在运行的实例。你可以参考这份指南在本地运行它。
  • 熟悉 Fluent Bit 的相关概念:例如输入、输出和缓冲区。如果您不熟悉这些概念,请参考官方文档

什么是 Syslog?

Syslog 是一种消息日志标准。它支持将生成消息的软件、存储消息的系统以及报告和分析消息的软件分离开来。

系统日志消息通常通过 UDP 端口514(或非root环境中的5140)传输。由于它是一种“发后即忘”的协议,因此速度快且轻量,非常适合从路由器、防火墙和轻量级Linux容器进行大量日志记录。然而,原始的系统日志文本难以查询。通过使用 Fluent Bit,我们可以接收这些消息,对其进行结构化处理,并将它们存储在 Elasticsearch 等搜索引擎中。

要了解有关 Syslog 的更多信息,您可以参考Syslog维基百科页面

方案结构

这套演示环境可以理解为三段:

  1. 日志生产端:两个 Alpine 容器通过 logger 命令每 10 秒产生一条 Syslog 消息。
  2. 日志接收和转发端:Fluent Bit 监听 UDP 5140,接收 Syslog 消息并按配置转发。
  3. 日志存储和查询端:Elasticsearch 接收写入,Kibana 通过 syslog-data* 数据视图查看日志。

在真实环境中,Alpine logger 可以替换为路由器、防火墙、Linux 主机、遗留应用或其他支持 Syslog 的系统。

我们的用例

在本演示中,我们将使用 Docker Compose 创建一个模拟环境:

  • Fluent Bit: 配置为监听 UDP 端口5140以接收系统日志(Syslog)流量。
  • Alpine loggers: 两个独立的 Alpine Linux 容器,将充当“网络设备”。它们将使用logger命令每10秒生成一次日志消息,并将其发送到我们的 Fluent Bit 容器。
  • Elasticsearch:我们的日志将被存储和索引的目的地。

操作说明

1. 创建项目目录

首先,创建一个目录来存放你的配置文件和 Docker Compose 文件。

mkdir fluent-bit-syslog-demo
cd fluent-bit-syslog-demo

2. 创建 Fluent Bit 配置

创建一个名为 fluent-bit/config 的目录,并在其中创建一个名为 fluent-bit.yaml 的文件,内容如下:

service:
  flush: 1
  log_level: info
  parsers_file: parsers.conf

pipeline:

  inputs:
    - name: syslog
      mode: udp
      listen: 0.0.0.0
      port: 5140

  outputs:
    - name: es
      match: '*'
      # CHANGE THESE TO MATCH YOUR ELASTICSEARCH SETUP
      host: 192.168.1.5
      port: 9200
      index: syslog-data
      http_user: elastic
      http_passwd: rslglTS4
      suppress_type_name: 'On'

此文件指示 Fluent Bit 监听系统日志消息,并将其转发到您的 Elasticsearch 实例。

注意:更新输出部分中的 host, http_user 和 http_passwd,使其与您实际的 Elasticsearch 凭据匹配。

3. 创建 Docker Compose 文件

创建一个名为 docker-compose.yaml 的文件,内容如下:

services:
  fluent-bit:
    image: 'fluent/fluent-bit:latest'
    container_name: fluent-bit
    ports:
      - '6000:5140/udp'
      - '24224:24224'
    volumes:
      - './fluent-bit/config/fluent-bit.yaml:/fluent-bit/etc/fluent-bit.yaml'
    networks:
      - syslog-test
    restart: unless-stopped
    command: '-c /fluent-bit/etc/fluent-bit.yaml'
  alpine-logger-1:
    image: 'alpine:latest'
    container_name: alpine-logger-1
    depends_on:
      - fluent-bit
    networks:
      - syslog-test
    command: |
      /bin/sh -c " apk add --no-cache util-linux && while true; do
        logger -n fluent-bit -P 5140 -t alpine-test \"This is a test message from Alpine Logger 1 at \$(date)\"
        sleep 10
      done "      
  alpine-logger-2:
    image: 'alpine:latest'
    container_name: alpine-logger-2
    depends_on:
      - fluent-bit
    networks:
      - syslog-test
    command: |
      /bin/sh -c " apk add --no-cache util-linux && while true; do
        logger -n fluent-bit -P 5140 -t alpine-test \"This is a test message from Alpine Logger 2 at \$(date)\"
        sleep 10
      done "      
networks:
  syslog-test:
    driver: bridge

此文件定义了我们的 Fluent Bit 服务以及两个生成流量的 Alpine 容器。Alpine 容器使用 logger 命令行界面以 Syslog 格式创建日志。

4. 运行容器

使用 Docker Compose 启动环境:

docker-compose up -d

容器运行后,Alpine 实例会立即开始将日志发送到 Fluent Bit,后者会将日志转发到 Elasticsearch。

5. 在 Elasticsearch 中验证日志

注意:我们仅在 Elasticsearch 中创建了模式为 syslog-data* 的索引。要在 Kibana 中查看这些日志,您需要创建一个数据视图。

6. 清理

docker compose down -v

总结

在本指南中,我们成功使用 Fluent Bit 搭建了一个轻量级的 Syslog 收集器。我们模拟了一个真实的环境,其中多台服务器通过 UDP 将日志发送到一个中心点。Fluent Bit 收集这些日志并将其传输到 Elasticsearch 进行存储和分析。

当然,把各类 Metrics、Logs、Traces、Profiles 相关数据构建起来,也只是构建了数据底座,如果没有办法从数据中提取洞察,没有办法帮我们排障,那可观测性体系就失去了意义。快猫星云的 Flashcat 产品,以开源夜莺为内核打造的统一可观测平台,是国内顶级互联网公司可观测性实践的产品化落地,赋能千行百业快速构建统一的可观测性体系和数据驱动的稳定性治理框架,用 AI 驱动,加速您的故障定位!申请产品技术交流和试用

FAQ

Q1:为什么用 Fluent Bit 做集中式 Syslog 服务器? A:Fluent Bit 轻量,支持 Syslog input 和 Elasticsearch output,可以在日志生产端不部署复杂 Agent 的情况下,把设备或主机日志集中转发到后端存储。

Q2:为什么示例监听 5140 而不是 514? A:Syslog 常见端口是 UDP 514,但非 root 环境或容器演示中使用 5140 更方便。示例通过 Docker 端口映射把宿主机 UDP 6000 映射到容器内 5140。

Q3:UDP Syslog 会丢日志吗? A:UDP 本身不保证投递。本文示例用于演示链路;生产环境如果要求更高可靠性,需要评估 TCP、缓冲、重试、磁盘队列和后端可用性。

Q4:Kibana 里看不到日志时先查什么? A:先确认 Elasticsearch 地址和凭据是否正确,再检查 Fluent Bit 容器日志、syslog-data 索引是否生成,以及 Kibana 是否创建了 syslog-data* 数据视图。

原文:https://thenewstack.io/shipping-syslog-data-to-elasticsearch-with-fluent-bit/

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云