找回密码
立即注册
搜索
发回帖 发新帖

6570

积分

0

好友

836

主题
发表于 3 小时前 | 查看: 6| 回复: 0

为什么需要轻量级日志监控方案

目前企业级主流的日志监控技术栈大多采用 ELK(Elasticsearch + Logstash + Kibana)。

Elasticsearch(ES)— 存储与搜索引擎

负责存储所有收集来的日志数据,并提供全文搜索和聚合分析能力。

Logstash — 数据收集与处理管道

负责从各种来源(如文件、Syslog、Kafka、数据库)采集日志,然后进行过滤、解析、格式化,最后输出到 Elasticsearch。

Kibana — 可视化与交互界面

这是 ELK 的"仪表盘"。它基于 Web,让你能通过浏览器与 Elasticsearch 中的数据交互。

对于拥有大数据、高并发的系统,用 ELK 做日志监控是相当合理的。但对于大多数中小规模系统,并且在国产化和合规越来越受重视的今天,这套技术栈显然过于沉重,不太合适。那么,有没有一种轻量级并且符合信创要求的技术选型呢?

有的有的,兄弟,有的!

就是今天要介绍的 Easysearch + FluentBit。

Easysearch — 国产化轻量搜索引擎

Easysearch 是基于 Elasticsearch 7.10 内核的国产化增强版本:API、DSL、SDK、索引格式高度兼容,但在内核、安全、中文能力、信创适配和运维工具方面做了不少增强。

AI 能力方面,原生支持向量检索、混合检索、RAG 集成、大模型 Embedding 接入。

Easysearch 还内置了 Web UI,只要部署了 Easysearch,就能直接访问内置的可视化页面,不用像 ELK 一样还要额外部署 Kibana。

它的 Web UI 大概长这样:

Easysearch 集群概览界面,显示集群状态、内存、CPU、JVM堆内存及存储等指标

FluentBit — 轻量化日志采集器

FluentBit 是一个开源、轻量、高性能的日志/指标/追踪采集与转发器,适合对采集格式简单的日志做基础解析和路由。它用 C 语言实现,通常内存占用低于 10MB,零外部依赖,适合部署在每台服务器、容器节点或 K8s DaemonSet 上。

如果日志量大、存储成本高、日志格式简单、需要国产化合规,或者希望减少运维负担、更加轻量化,Easysearch + FluentBit 会更有优势。

下面介绍如何使用 Easysearch + FluentBit 搭建一套完整的日志监控。

部署 Easysearch

这里介绍使用 Docker 方式进行部署,其他部署方式可以参考官方文档。

Easysearch 官方文档:

https://docs.infinilabs.com/easysearch/main/

Easysearch 官方文档快速开始页面,展示一键安装命令及各平台安装选项

创建 .env 配置文件,配置自定义密码:

touch .env
echo "EASYSEARCH_INITIAL_ADMIN_PASSWORD=$(printf "%s%s%s@%s" "$(tr -dc a-z</dev/urandom|head -c4)" "$(tr -dc A-Z</dev/urandom|head -c3)" "$(tr -dc 0-9</dev/urandom|head -c2)" "$(tr -dc a-z0-9</dev/urandom|head -c3)")" | tee .env

容器内 Easysearch 用户的 uid 为 602,通过调整宿主机的目录权限,确保在容器内部 Easysearch 用户有权限读写挂载的数据卷:

sudo chown -R 602:602 /person/data/docker/easysearch

将镜像中的 config 目录复制到本地目录:

docker run --rm --env-file /person/data/docker/easysearch/.env -v /person/data/docker/easysearch:/work infinilabs/easysearch:2.3.1-2903 cp -rf /app/easysearch/config /work

启动容器:

docker run \
-d --restart always \
-p 9200:9200 \
-p 9300:9300 \
--ulimit memlock=-1:-1 \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /person/data/docker/easysearch/data:/app/easysearch/data \
-v /person/data/docker/easysearch/config:/app/easysearch/config \
-v /person/data/docker/easysearch/logs:/app/easysearch/logs \
--name easysearch --hostname easysearch \
infinilabs/easysearch:2.3.1-2903

启动成功后,查看容器是否启动成功或查看启动日志:

docker ps
docker logs 容器ID

Docker 容器运行状态,显示 Easysearch 容器 ID、镜像版本及端口映射信息

启动成功后,访问 https://服务器IP:9200/ ,弹出的登录窗口输入用户名(admin)和密码(.env 文件中查看)。

Easysearch API 返回的节点信息 JSON,包含集群名称、版本及 Lucene 版本等详情

访问 Easysearch Web UI:https://服务器IP:9200/_ui/#/home

Easysearch 管理后台概览页,展示集群运行时长、资源使用率及索引统计

配置 logback-spring.xml

日志源来自哪里呢?这里用一个市场主流的 SpringBoot 框架搭建的应用系统,来实现日志监控。

对于一个 SpringBoot 项目,日志的核心当然是它的 logback-spring.xml 配置文件,主要作用是日志的输出管理。

下面只展示一些 logback 的核心配置,其他配置根据自身需求可自行调整。

定义应用名称:

<!-- 从 Spring 环境动态获取应用名称,默认值兜底 -->
<springProperty name="APP_NAME" source="spring.application.name" defaultValue="iceberg-app"/>

日志输出路径:

<!-- 生产环境:输出到服务器指定目录 -->
<springProfile name="prod">
    <property name="LOG_HOME" value="/person/logs/iceberg-cloud/${APP_NAME}"/>
</springProfile>

生成日志文件:

<!-- 生成简洁文本日志文件(年月日时分秒 + 日志内容),供 Fluent Bit 采集并写入 Easysearch -->
<appender name="FILE_JSON" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_HOME}/application.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>${LOG_HOME}/application-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
        <maxFileSize>50MB</maxFileSize>
        <maxHistory>7</maxHistory>
        <totalSizeCap>1GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

这段配置的要点:

  • 按天 + 按大小滚动:单文件 50MB 触发切分,历史文件压缩为 .gz。
  • 保留 7 天、总量上限 1GB,自动清理防止磁盘堆积。

异步化包装:

<!-- 将 FILE_JSON 包装为异步模式,避免日志 I/O 阻塞业务线程 -->
<appender name="ASYNC_JSON" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE_JSON"/>
    <queueSize>512</queueSize>
    <discardingThreshold>0</discardingThreshold>
</appender>
  • 日志写盘 I/O 移出业务线程,不阻塞业务。
  • 队列容量 512。
  • discardingThreshold=0:队列满时也不丢弃任何级别的日志,保证采集完整性。

这样,你的系统就可以在启动或者运行中生成一个 application.log 日志文件。

项目目录结构,展示 application.log 及压缩历史日志文件

部署 Fluent Bit 采集日志并输出到 Easysearch

接下来,就需要用 FluentBit 去找到日志文件,然后进行数据采集。

创建 fluent-bit.yaml 文件并配置。

全局服务配置:

service:
  flush: 1              # 设置数据刷新间隔
  log_level: info       # 设置 Fluent Bit 自身的运行日志级别(可选:error, warn, info, debug, trace)
  daemon: "off"         # 前台运行
  http_server: "on"     # 开启内置的 HTTP 监控服务,用于暴露内部运行指标(Metrics)
  health_check: "on"    # 开启健康检查端点(默认在 /api/v1/health)
  http_listen: 0.0.0.0
  http_port: 2020

  storage.path: /person/logs/fluentbit/

  # 同步模式:
  # - normal:平衡性能和数据安全(推荐)
  # - full:每次写入都同步到磁盘(最安全但性能较差)
  # - light:最少同步操作(性能最好但可能丢数据)
  storage.sync: normal
  storage.backlog.mem_limit: 50MB

文本日志解析器:

parsers:
  # 单行正则解析
  - name: log_text
    format: regex
    regex: '^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) \[(?<level>[A-Z]+)\] (?<log>[\s\S]*)$'
    time_key: time
    time_format: '%Y-%m-%d %H:%M:%S.%L'
    time_keep: true

服务输入源:

pipeline:
  inputs:
    # 管理端 (iceberg-admin)
    - name: tail
      tag: iceberg-admin
      path: /person/logs/iceberg-cloud/iceberg-admin/application.log
      parser: log_text
      refresh_interval: 5
      skip_long_lines: "on"
      read_from_head: "false"
      mem_buf_limit: 50MB
      multiline: "off"
      ignore_older: 72h
      rotate_wait: 5
      exit_on_eof: "false"

统一过滤器配置:

filters:
    # --- 管理端 ---
    - name: modify
      match: iceberg-admin*
      add:
        - service_name iceberg-admin

输出目的地配置:

outputs:
    # --- 统一输出通道:将所有服务的日志统一存入 Easysearch ---
    - name: es                      # 使用 Elasticsearch 输出插件(Easysearch 完全兼容此协议)
      match: "*"                    # 通配符 "*" 表示匹配所有经过 Filter 处理的日志
      host: 目标 Easysearch 集群的主机 IP 或域名
      port: 9200                    # Easysearch 的 HTTP 通信端口
      tls: "on"
      tls.verify: "off"
      http_user: admin              # 访问 Easysearch 的认证用户名
      http_passwd: saxmOSE46@7ih    # 访问 Easysearch 的认证密码
      logstash_format: "on"         # 开启 Logstash 格式,使索引名称支持按时间(天)自动滚动
      logstash_prefix: app-logs     # 索引前缀,最终生成的索引名为 app-business-YYYY.MM.DD
      retry_limit: false

把以上配置放到你的 fluent-bit.yaml 配置文件中即可。

启动容器:

docker run -d \
--name fluent-bit \
--restart unless-stopped \
-p 24224:24224 \
-p 2020:2020 \
-v /person/data/docker/fluentbit/fluent-bit.yaml:/fluent-bit/etc/fluent-bit.yaml \
-v /person/logs/iceberg-cloud:/person/logs/iceberg-cloud \
fluent/fluent-bit:5.1.0 \
-c /fluent-bit/etc/fluent-bit.yaml

注意:

  • 2020 端口用于访问日志采集信息,一定要映射。
  • 需要采集的宿主机日志文件,也要挂载到容器内部。

启动成功后,查看容器是否启动成功或查看启动日志:

docker ps
docker logs 容器ID

Fluent Bit 启动日志,显示版本信息、各 input 插件初始化及 output 到 Easysearch 的状态

那么问题来了,系统既然已经生成了 application.log 日志文件,怎么知道 FluentBit 有没有采集成功呢?

访问:http://服务器IP:2020/api/v1/metrics

输出:

Fluent Bit HTTP 服务返回的原始 metrics 数据,包含 input 与 output 各插件统计信息

美化一下输出格式,可以看到 input 到 FluentBit 中 288 条:

Fluent Bit input 统计,tail.0 插件采集记录数 288 条

output 到 Easysearch 也是 288 条:

Fluent Bit output 统计,es.0 插件成功处理 288 条记录且无错误

可以让 AI 帮忙分析一下这段输出:

表格展示 Fluent Bit 输出统计字段含义,288 条记录全部成功发送无报错

到这里,我们的 FluentBit 也成功采集到日志了,并且已经将数据落盘到 Easysearch。去 Easysearch Web UI 看看。

访问:服务器IP:9200/_ui/#/home

索引已经新建成功了:

Easysearch 索引管理页面,显示 app-logs-2024.10.18 索引已创建且状态为 Open

日志也一目了然了:

Easysearch 数据探索页面,展示 SpringBoot 应用日志详情,包含 Dubbo 及 RocketMQ 相关日志记录

至此,Easysearch + FluentBit 的基础日志监控就搭建完成了,后续大家可以自行扩展!

熊猫头表情包:再见了别人的小宝贝




上一篇:嵌入式报价为啥被拉黑?算法卖100万,整包3万没人要
下一篇:HMDS是什么?六甲基二硅氮烷在光刻胶增粘中的作用与工艺控制
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-19 19:33 , Processed in 0.085877 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表