使用 Logstash 接入数据

使用 Logstash 接入数据 #

Logstash 适合做“重量级管道”:支持丰富的输入源、过滤器和输出插件。
这一页只解决几个核心问题:

  • 最小可用的 Logstash → Easysearch pipeline 长什么样?
  • 和 Easysearch 的索引与 mapping 怎么配合,避免“写进去一团糊”?
  • 在生产环境里,批量大小、重试、幂等这些常见坑怎么规避?

1. 最小可用 Pipeline 示例 #

下面是一个从文件读取日志、简单解析后写入 Easysearch 的最小示例(概念结构):

input {
  file {
    path => "/var/log/app/app.log"
    start_position => "beginning"
    sincedb_path => "/var/lib/logstash/.sincedb_app"
  }
}

filter {
  # 示例:按 JSON 日志解析
  json {
    source => "message"
  }

  # 示例:统一时间字段名称
  if [timestamp] {
    mutate {
      rename => { "timestamp" => "@timestamp" }
    }
  }
}

output {
  elasticsearch {
    hosts => ["http://easysearch:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
    # user / password / ssl 相关配置按实际集群安全设置填写
  }
}

要点:

  • index 命名:直接按日期切索引,方便后续在 Easysearch 里做数据保留与迁移。
  • @timestamp 统一:便于在查询、聚合和排序时统一时间字段。
  • Logstash 内部会自动对 Easysearch 使用 _bulk 写入,你只需要关注批量大小等参数。

安全相关配置(TLS、账号密码等)请参考 Easysearch 的安全模块与 Logstash 官方文档,这里不展开具体参数表。

2. 和 Easysearch 的索引与 mapping 如何配合? #

Logstash 的输出只是“把文档发到某个索引”,索引本身如何配置,还是要在 Easysearch 侧做好设计:

  • 优先使用索引模板
    • 索引模板中定义好 settings + mappings + aliases。
    • app-logs-* 这类索引在自动创建时,字段类型就正确、默认别名也就位。
  • 控制动态映射
    • 日志数据字段多、变化快,建议通过动态模板控制新字段类型,而不是完全放开放飞。
    • 避免“同一个业务字段有时是字符串、有时是数值”导致 mapping 冲突。
  • 统一关键字段约定
    • 时间:统一用 @timestampdate 类型)。
    • 租户/环境:如 tenant_idenv 字段,后续在 Easysearch 里会经常被用作 filter。

典型做法是:

  1. 在 Easysearch 侧先写好模板和索引设计;
  2. 再在 Logstash 里只负责“把字段映射到约定好的名字”,尽量不在 Logstash 里做复杂业务逻辑。

3. 批量、重试与幂等:生产环境的几个关键参数 #

Logstash 向 Easysearch 写入时,本质是使用 _bulk 接口。
几个需要重点关注的点:

  • 批量大小
    • 输出插件中的批量相关设置决定单次 bulk 的条数。
    • 批量太小:QPS 高但效率差;太大:单次失败重试成本高,内存压力大。
  • 重试策略
    • 对于暂时性错误(如 429、部分 5xx)可以允许有限次数自动重试。
    • 对于数据本身有问题的 4xx(mapping 冲突、字段类型错误)不要盲目重试,应通过监控/告警修正上游数据或 mapping。
  • 幂等性
    • 如果上游可能重放数据(比如消息队列消费失败重试),应在 Logstash 里选择合适的文档 ID(例如业务主键),让多次写入不会制造重复脏数据。
    • 对于日志类场景,可以接受“多一条重复”,则可以用自动生成 ID;对业务数据同步,更建议使用稳定 ID。

这些参数和行为,在权威指南里会有比较通用的建议,迁移到 Easysearch 上时只要统一用 Easysearch 的版本语义来验证即可。

4. 常见坑与规避建议 #

结合 Easysearch 的特点,Logstash 集成时容易踩的坑主要有:

  • 日志行解析失败
    • jsongrok 解析失败,导致字段乱掉或全部落在 message
    • 建议为解析失败的记录设置单独标签和输出(比如写入一个 *-deadletter 索引),避免污染主索引。
  • 动态字段爆炸
    • 比如把整个 JSON 嵌套全展开到字段,或接入包含高基数字段名的数据源。
    • 建议通过 dynamic_templates 或 Logstash 过滤器提前裁剪/归一字段。
  • 时间与时区问题
    • 日志中时间字符串没有带时区,或格式不统一,导致 @timestamp 解析偏差。
    • 建议统一在 Logstash filter 里用 date 插件解析成 @timestamp,并确认时区。
  • 安全与权限
    • 在启用了 Easysearch 安全功能时,为 Logstash 准备专门的角色/账号,只授予必要的索引写入权限。

这些问题大多属于“接入层老生常谈”,但一旦踩了坑,排查成本会很高,建议在首次上线前就按 checklist 自查一遍。

5. 相关章节 #

想深入了解接入前后两端的更多细节,可以继续看: