Filebeat+Logstash采集多个日志文件写入不同的ES索引

本文介绍了如何结合Filebeat和Logstash进行日志收集和处理。Filebeat用于轻量级地监控不同路径的日志文件,如Nginx、Elasticsearch和Ruoyi服务的日志,通过添加'log_type'字段进行区分,并将数据发送至Logstash的5044端口。Logstash则根据'log_type'字段对日志进行过滤和解析,如JSON解析和日期转换,最后根据字段值将日志分别输出到不同的Elasticsearch索引中,如'es-YYYY.MM'、'ruoyi-YYYY.MM.dd'和'nginx-YYYY.MM'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Logstash依赖于JVM,在启动的时候大家也很容易就能发现它的启动速度很慢很慢,但logstash的好处是支持很多类型的插件,支持对数据做预处理。而filebeat很轻量,前身叫logstash-forward,是使用Golang开发的,所以不需要有java依赖,也很轻量,占用资源很小,但功能也很少,不支持对数据做预处理。因此一般都是将filebeat+logstash组合使用,在每个节点部署filbeat,然后将监控的日志推送到数据缓冲层或直接推送到logstash集群内,配合redis或kafka做数据缓冲层来使用。

本篇就介绍如何将filebeat和logstash同时使用,并且介绍如何同时监控多个文件,将多个文件导出至不同的索引内。

Filebeat配置
vim /app/filebeat/filebeat.yml

同时监控nginx的日志以及es和ruoyi 服务得java类型日志,并且分别新增一个字段'log_type'(自定义的)来做区分,输出到localhost的5044端口,由logstash消费:

filebeat.inputs:

- type: log
  paths:
    - /var/log/nginx/*.log
  fields:
    log_type: "nginx"

  json.key_under_root: true
  json.overwite_keys: true

- type: log
  enabled: true
  paths:
    - /var/log/elasticsearch/elasticsearch.log
  fields:
    log_type: "es"

  multiline.pattern: '^\s'
  multiline.negate: true
  multiline.match: after

- type: log
  enabled: true
  paths:
    - /data/ruoyi/*.log
  fields:
    log_type: "ruoyi"

  multiline.pattern: '^\s'
  multiline.negate: true
  multiline.match: after

output.logstash:
  enabled: true
  hosts: ["localhost:5044"]

Logstash配置
vim /app/logstash/config/beat_es.conf

修改logstash配置,input的部分要与filbeat中的端口一致,filter的部分针对不同的日志内容做不同的预处理或解析,output中对不同的日志输出到不同的es的索引中。这里的 log_type就是在上面的filebeat中新增的自定义字段:

input {
   #从filebeat取数据,端口与filebeat配置文件一致
   beats {
     port => 5044
   }
}
filter {
    #只对nginx的json日志做json解析,系统message为其他格式,无需处理
    if [fields][log_type] == "nginx"{
      json {
         source => "message"
         remove_field => ["beat","offset","tags","prospector"] #移除字段,不需要采集
      }
      date {
        match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"] #匹配timestamp字段
        target => "@timestamp"  #将匹配到的数据写到@timestamp字段中
      }
  }
}
 
output {
       # 输出es,这的filetype就是在filebeat那边新增的自定义字段名
       if [fields][log_type] == "es" {
         elasticsearch {
            hosts => ["node1:9200","node2:9200"]
            index => "es-%{+YYYY.MM}"
        }
       } 
       if [fields][log_type] == "ruoyi" {
         elasticsearch {
            hosts => ["node1:9200","node2:9200"]
            index => "ruoyi-%{+YYYY.MM.dd}"
        }
       }
       if [fields][log_type] == "nginx" {
         elasticsearch {
            hosts => ["node1:9200","node2:9200"]
            index => "nginx-%{+YYYY.MM}"
        }       
       }
}

启动Filebeat和Logstash
先启动logstash,不然的话filebeat会找不到logstash的5044端口:

bin/logstash -f config/beat_es.conf

./filebeat -e -c filebeat.yml

### ELK 和 LK 架构组成及工作流程 #### 1. **ELK 架构** ELK 是由 ElasticsearchLogstash 和 Kibana 组成的企业级日志分析系统。以下是各组件的功能描述: - **Elasticsearch**: 这是一个分布式的全文搜索引擎,负责存储和索引数据,并提供高效的查询功能[^1]。 - **Logstash**: 它是一种服务器端的数据处理管道工具,可以从多个来源采集数据,对其进行过滤和转换后发送到指定的目标位置[^4]。 - **Kibana**: 提供了一个友好的界面来帮助用户搜索、查看和交互存放在 Elasticsearch 中的数据,支持多种方式的可视化展示[^3]。 整个系统的典型工作流如下: 1. 数据通过 Logstash 或其他 Beats 工具(如 Filebeat)被收集并传输至 Elasticsearch; 2. Elasticsearch 对这些数据进行存储和索引操作以便后续检索; 3. 用户利用 Kibana 查询所需信息并通过图形化的方式呈现出来。 #### 2. **LK 架构** 如果仅考虑 LK (Logstash + Kibana),则缺少了核心数据库层 Elasticsearch 的参与。在这种情况下: - **Logstash** 将继续承担起从前端接收输入事件的任务, 并可能直接对接某些特定类型的下游服务或者文件系统作为输出目标而不是写入 ES; - 而对于 **Kibana**, 如果没有连接到 ES 实例上,则其主要作用会受到很大限制因为大部分内置特性都依赖于后者所提供的强大查询引擎来进行驱动. 不过,在实际应用当中很少单独部署这样的组合形式(即不包含ES), 因为这会使整体解决方案变得不够完善且效率低下. #### 3. **架构图概述** 虽然无法在此处绘制具体的图片表示法,但是可以根据上述说明构建相应的逻辑关系图谱: - 在标准版 `ELK` 设计里边应该体现出三个模块之间的紧密联系:左侧代表各类原始资料源头经过中间环节(Logstash/Beats)加工后再送达到右侧最终储存区位(elasticsearch);上方再叠加一层专门用来做前端展现的部分(kibana). - 至于简化版本也就是所谓的 'lk' 方案下就只剩下了前后两端相互配合完成部分基础任务而已. ```mermaid graph TD A[Data Sources] --> B{Logstash} C[Elasticsearch] <--|Index Data Into| D[Kibana] E(Filebeat) -.-> F{Logstash} G(User Interface) -- Query & Visualize --> H(Kibana) ``` 此Mermaid语法定义了一种简单的流程图,展示了如何从不同数据源流向最终可视化的路径。 --- ### 示例代码片段 下面给出一段 Python 脚本示例演示如何向 Elasticsearch 发送请求获取文档内容: ```python from elasticsearch import Elasticsearch es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) res = es.search(index="test-index", body={"query": {"match_all": {}}}) print("Got %d Hits:" % res['hits']['total']) for hit in res['hits']['hits']: print(hit["_source"]) ``` 该脚本初始化了一个指向本地运行实例的服务对象,并执行基本搜索命令返回所有匹配项的结果集列表。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值