开源软件日志统一管理方案-Filebeat

本方案基于ELK(Elasticsearch、Logstash、Kibana)架构,以 Filebeat 为轻量级采集器,在原有基础配置并通过 Logstash 进行统一处理,最终汇入 Elasticsearch。

一: ELK 环境状态检查 (前置工作)

在进行数据采集之前,请务必检查您现有的 ELK 堆栈(Elasticsearch、Logstash、Kibana)是否健康且准备就绪。

|---------------|---------|----------------------------------------------------------------------------|-------------------------|
| 组件 | 检查项 | 检查方法 / 命令 | 预期状态 |
| Elasticsearch | 集群状态和健康 | curl -X GET "http://ES_HOST:9200/_cluster/health?pretty" | status 为 green 或 yellow |
| Elasticsearch | 节点磁盘空间 | curl -X GET "http://ES_HOST:9200/_cat/allocation?v" | 磁盘利用率在安全范围内 |
| Logstash | 运行状态 | 检查进程或服务状态 | 正常运行,无配置错误 |
| Kibana | 访问性 | 浏览器访问 http://KIBANA_HOST:5601 | 界面可正常显示 |
| 网络 | 端口连通性 | 源服务器到 ES/Logstash 的端口连通性,如 telnet LOGSTASH_HOST 5044 或 telnet ES_HOST 9200 | 端口可正常连通 |

二:数据采集器配置 (Filebeat)

我们推荐使用 Filebeat 部署在各个应用服务器上进行日志文件采集。对于大多数常见应用,Filebeat 提供了预置的 Modules(模块)可以简化配置和处理。以下是各应用在 /etc/filebeat/filebeat.yml 或 /etc/filebeat/modules.d/ 目录中的配置片段:

1. Nginx 日志采集

使用 Filebeat 的 nginx 模块。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # /etc/filebeat/modules.d/nginx.yml - module: nginx # 访问日志 access: enabled: true # 调整为您的访问日志路径 var.paths: ["/var/log/nginx/access.log*"] # 错误日志 error: enabled: true # 调整为您的错误日志路径 var.paths: ["/var/log/nginx/error.log*"] |

2. Tomcat 日志采集

使用 Filebeat 的 tomcat 模块。

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # /etc/filebeat/modules.d/tomcat.yml - module: tomcat # Catalina 日志 catalina: enabled: true # 调整为您的 catalina 日志路径 var.paths: ["/opt/tomcat/logs/catalina*.log"] # 访问日志 access: enabled: true # 调整为您的访问日志路径 (通常需要配置阀门Valve) var.paths: ["/opt/tomcat/logs/localhost_access_log*.txt"] |

3. Elasticsearch 日志采集

使用 Filebeat 的 elasticsearch 模块。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # /etc/filebeat/modules.d/elasticsearch.yml - module: elasticsearch # 服务器日志 server: enabled: true # 调整为您的 ES 日志路径 var.paths: ["/var/log/elasticsearch/my-cluster.log*"] |

4. Redis 日志采集

Redis 没有专门的 Filebeat 模块。使用传统的 prospector (输入配置)。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: # 调整为您的 Redis 日志路径 - /var/log/redis/redis.log tags: ["redis"] # 添加标签,方便Logstash进行过滤 |

5. ZooKeeper 日志采集

ZooKeeper 没有专门的 Filebeat 模块。使用传统的 prospector。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: # 调整为您的 ZooKeeper 日志路径 - /var/log/zookeeper/zookeeper.log tags: ["zookeeper"] |

6. Kafka/RocketMQ 日志采集

对于 Kafka 和 RocketMQ,它们通常将业务日志和系统日志分开。系统日志(如 server.log)使用 prospector 采集,业务日志根据具体格式处理。

  1. Kafka System Logs (例如)

|----------------------------------------------------------------------------------------------------------------------------------------------------|
| # /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: # 调整为您的 Kafka 日志路径 - /opt/kafka/logs/server.log* tags: ["kafka"] |

  1. RocketMQ System Logs (例如)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: # 调整为您的 RocketMQ 日志路径 - /root/logs/rocketmqlogs/broker.log tags: ["rocketmq"] |

三:数据输出配置 (Filebeat)

在每个应用服务器的 /etc/filebeat/filebeat.yml 文件底部,配置 Filebeat 的输出目标为 Logstash。

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 统一配置 Filebeat 输出到 Logstash output.logstash: # Logstash 服务器地址和端口(默认5044) hosts: ["LOGSTASH_HOST:5044"] # 如果Logstash不可用,可以尝试直接输出到Elasticsearch (不推荐,跳过了统一处理) # output.elasticsearch: # hosts: ["ES_HOST:9200"] |

四:数据收集后的统一管理配置 (Logstash)

Logstash 负责接收所有 Filebeat 传来的数据,进行结构化(解析)和统一处理。创建一个 /etc/logstash/conf.d/02-all-logs.conf 文件。

1. Input (输入)

接收 Filebeat 的数据。

|-----------------------------------------------------------------------|
| # Logstash 输入配置 input { # 接收来自 Filebeat 的数据 beats { port => 5044 } } |

2. Filter (过滤与解析)

这是统一管理的核心。使用 if/else 结构根据 Filebeat 传入的 type 或 tags 字段来区分日志来源,并应用相应的解析器。

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # Logstash 过滤配置 filter { # Filebeat Modules 日志 (Nginx, Tomcat, ES) - 优先使用 if [fileset][module] { # 如果使用了模块,则 Logstash 的处理大多由模块的 Ingest Pipeline 完成,这里不需要复杂的配置 # 但可以通过 mutate 添加/修改通用字段 mutate { add_field => { "log_source" => "%{[fileset][module]}" } } } # 自定义采集日志 (Redis, Zookeeper, Kafka, RocketMQ) - 通过 tags 区分 else if "redis" in [tags] { grok { # 简化示例,根据实际 Redis 日志格式调整 match => { "message" => "(?<redis_timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}T%{TIME}[+-]%{HOUR}:%{MINUTE})\s*%{GREEDYDATA:log_content}" } } } else if "zookeeper" in [tags] { grok { # 简化示例,根据实际 ZK 日志格式调整 match => { "message" => "\[%{DATA:zk_time}\]\s+%{LOGLEVEL:log_level}\s+\[%{DATA:thread}\]\s+-\s+%{GREEDYDATA:log_content}" } } } # 为其他自定义日志类型添加更多 if/else 块... else if "kafka" in [tags] { # ... Kafka 解析逻辑 ... } else if "rocketmq" in [tags] { # ... RocketMQ 解析逻辑 ... } # 通用处理:为所有日志添加地理位置信息等 # 例如: # geoip { # source => "client_ip" # } } |

3. Output (输出)

将处理后的数据统一写入 Elasticsearch。

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # Logstash 输出配置 output { elasticsearch { hosts => ["ES_HOST:9200"] # 动态索引名称:按日期和应用类型命名索引,便于管理 index => "logstash-%{[log_source]}-%{+YYYY.MM.dd}" # 如果不使用 log_source 字段 (即没有用 Filebeat Modules 或 tags),可以使用默认索引名 # index => "logstash-generic-%{+YYYY.MM.dd}" } # 可选:控制台调试 # stdout { codec => rubydebug } } |

总结和方法

这个方案的核心方法是:

  1. 轻量级采集 (Filebeat):负责高效地读取日志文件并将原始数据传输到 Logstash,最小化对应用服务器的资源占用。
  2. 模块化和标签化
    1. 对于常见应用(Nginx, Tomcat, ES),尽量使用 Filebeat Modules,它们能自动处理日志路径和大部分解析工作,并在事件中添加必要的 [fileset][module] 字段。
    2. 对于非模块化应用(Redis, ZK, Kafka, RocketMQ),使用 tags 字段进行标识。
  3. 统一处理 (Logstash):作为数据管道的中心,根据 Filebeat 提供的标签或模块信息,进行精细化的 grok 解析、字段转换、时间戳处理等操作,将非结构化日志转化为结构化数据。
  4. 结构化存储 (Elasticsearch) :利用 Logstash 动态生成的索引名称(例如 logstash-nginx-2025.11.11)将不同类型的日志分开存放,便于后续查询和维护。
相关推荐
飞Link2 小时前
【Anaconda】Linux(CentOS7)下安装Anaconda教程
linux·运维·python
Ama_tor2 小时前
docker|F盘安装の1键部署软件及数据储存+2个保姆级运行实例
运维·docker·容器
@时间旅行者@2 小时前
LINUX离线安装postgres,rpm方式安装
linux·运维·服务器·postgresql·离线安装
whlqjn_12112 小时前
Ubuntu 20.04图形界面卸载
linux·运维·ubuntu
杨云龙UP2 小时前
SQL Server 2016通过SSMS(SQL Server Management Studio)图形界面完成创建用户和授权_20251230
运维·服务器·数据库
斯普信云原生组3 小时前
Linux 平台 Redis Insight 安装卸载与常见问题
linux·运维·redis
qq_416276423 小时前
linux bashrc写各种离线库路径并验证
linux·运维·服务器
航Hang*3 小时前
第二章:网络系统建设与运维(中级)——华为设备基本命令
运维·计算机网络·华为·ensp·交换机
专注VB编程开发20年3 小时前
VB6 UIAutomation 自动化查找元素
运维·自动化·uiautomation·uia