使用 Vector 采集日志并直接发送到 ElasticSearch

秦晓辉 2025-03-25 20:31:37

很多 ToB 的小环境,机器量不多,但是仍然希望日志被集中收集,此时不需要太复杂的架构,就直接使用 Vector 即可采集日志并直接发送到后端 ElasticSearch,本文来做一个演示备忘。

Vector 简介

Datadog 的 Vector 是一个开源的、高性能的日志聚合、度量指标和分布式跟踪系统。它旨在收集、聚合和分析来自不同来源的数据,以便开发者和运维团队可以更好地监控和理解他们的应用程序和服务的性能。

Datadog Vector

以下是 Vector 的一些关键特性和优势:

  1. 统一的数据收集器:Vector 可以作为一个统一的数据收集器,替代传统的日志收集工具如 Fluentd、Logstash 等,简化了日志和度量指标的收集过程。
  2. 高性能:Vector 针对性能进行了优化,可以高效地处理大量的日志和度量指标数据,同时保持低延迟。
  3. 灵活的管道:Vector 提供了灵活的管道系统,允许用户定义数据的处理、转换和路由规则,以满足不同的监控和分析需求。
  4. 可扩展性:Vector 支持水平扩展,可以通过增加更多的 Vector 实例来处理更多的数据。
  5. 易于集成:Vector 可以轻松集成到现有的监控和度量指标生态系统中,如 Prometheus、Grafana、Elasticsearch 等。
  6. 安全性:Vector 提供了安全特性,如 TLS 加密、身份验证等,确保数据传输的安全性。
  7. 开源:Vector 是一个开源项目,允许用户自由使用、修改和贡献代码。
  8. 丰富的插件:Vector 支持多种输入和输出插件,可以轻松地与各种数据源和目标系统集成。

在本文中,我们将演示如何使用 Vector 采集日志并直接发送到 ElasticSearch。采集的是夜莺的日志,会对日志多解析,把日志解析成一些结构化字段。

Vector 配置

Vector 的配置文件可以是 yaml 或 toml 格式,我这里采用的是 yaml 格式,下面是我的配置内容:

data_dir: "/Users/ulric/works/vector-test/data_dir"

api:
  enabled: true

sources:
  app_logs:
    type: "file"
    include:
      - "/Users/ulric/works/gopath/src/nightingale/logs/*.log"

transforms:
  parse_log:
    type: "remap"
    inputs:
      - "app_logs"
    source: |
      . |= parse_regex!(.message, r'(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{6}) (?P<level>\w+) (?P<source_location>[^ ]+) (?P<message>.+)')
      .timestamp = parse_timestamp(.timestamp, format: "%Y-%m-%d %H:%M:%S.6%f") ?? now()
      .@timestamp = del(.timestamp)      

sinks:
  print:
    type: "console"
    inputs:
      - "parse_log"
    encoding:
      codec: "json"

  es:
    type: "elasticsearch"
    inputs:
      - "parse_log"
    endpoints:
      - "http://192.168.10.30:9200"
    batch:
      max_events: 1000
      timeout_secs: 5
    buffer:
      type: "disk"
      max_size: 536870976
      when_full: "block"
    bulk:
      index: "vector3-%Y.%m.%d"

上面的配置中,核心是包含了 sources、transforms 和 sinks 三个部分:

  • sources:定义了数据源,这里使用 file 类型的数据源,指定了要采集的日志文件路径。
  • transforms:定义了数据转换规则,这里使用 remap 类型的转换器,对日志进行解析,并将解析后的字段存储到结构化字段中。
  • sinks:定义了数据的输出目标,这里使用 console 类型的输出目标,将解析后的日志数据输出到控制台;同时使用 elasticsearch 类型的输出目标,将解析后的日志数据发送到 ElasticSearch。

其中最重要的是 transforms 部分,这里使用了 remap 类型的转换器,通过正则表达式解析日志中的时间戳、日志级别、日志来源和日志内容,并将解析后的字段存储到结构化字段中。这样,我们就可以在 ElasticSearch 中对日志数据进行更加灵活和高效的查询和分析。

下面是一条原始的夜莺的日志供参考:

2025-03-25 20:42:37.006681 INFO eval/eval.go:147 eval:alert-1-1 started

解析后的结构化字段如下:

{
  "@timestamp": "2025-03-25T20:42:37.006681Z",
  "level": "INFO",
  "source_location": "eval/eval.go:147",
  "message": "eval:alert-1-1 started"
}

当然了,Vector 采集日志的时候,还会附加一些额外的字段,比如 hostfile 等,这些字段可以在 ElasticSearch 中用于更细致的查询和分析。

Sinks 部分配置了两个输出目标,一个是 console 输出到控制台,只是为了方便调试;另一个是 es 输出到 ElasticSearch,将解析后的日志数据发送到 ElasticSearch 中,其中 bulk.index 配置了索引的格式,这里使用了时间格式,每天一个索引。

最终效果

我这里启动夜莺输出日志了,也不用 Kibana 看日志了,直接把 ElasticSearch 作为数据源配置到夜莺里,也可以在夜莺里查看日志。

夜莺中查看ElasticSearch中的日志

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat
Flashduty
Flashduty