Logstash 按主机组过滤系统日志?

Logstash 按主机组过滤系统日志?

我正在运行一个 Elasticsearch/Logstash/Kibana 实例,我很高兴地用来自各种主机的系统日志填充它。

通过构建它的扩展 - 使用多个 logstash syslogd 监听器和多个 ES 节点 - 它可以很好地整理大量服务器中的日志记录。

我现在只遇到一个问题 - 主机分组。我可以从配置数据库中根据各种标准获取主机分组的数据集 - 物理位置、“服务”、“客户”等。

我真的很希望能够将这些作为过滤条件添加到我的 elasticsearch 数据库中,如果可能的话,我可以在 Kibana 中使用它们而无需进行太多修改。

目前我正在考虑以下问题:

  • 自定义 logstash 过滤器在数据转储中查找主机名,并添加标签(实际上,我真正需要的是服务/客户/位置)。
  • 尝试为“宿主”文档添加父/子关系。
  • 使用“percolator”进行交叉引用(以某种方式?)
  • 一个‘脚本’字段?
  • 某种肮脏的黑客行为,涉及一个 cron 作业,用于在摄取后使用元数据更新记录。

但我想知道是否有人已经解决过这个问题,并且能够提出一个合理的方法?

答案1

经过一番研究,我最终决定的解决方案是使用 logstash 插件'过滤翻译'

这将获取一个包含键值的 YAML 文件,并允许您基于它重写传入的日志条目。

所以:

translate { 
    field => "logsource"
    destination => "host_group"
    dictionary_path => [ "/logstash/host_groups.dict" ]
}

这是一个相当简单的列表:

hostname : group
hostname2 : group

目前,它是静态的,并通过 重建和获取cron。我打算推动etcdconfd制定一个更具适应性的解决方案。

这意味着事件在进入 elasticsearch 时已被“标记”,而且由于我的 logstash 引擎是分布式和自主的,因此无论如何运行“缓存”列表都是可取的。我的主机列表变化不够快,这是一个问题。

答案2

您说您使用 Logstash 的syslog输入插件作为主机本地 syslog 守护进程的目标。

假设每个主机的系统日志守护程序也将日志条目写入文件,则可以使用Filebeat将这些文件推送到 LS,并在源处添加正确的标签。根据您拥有的主机数量,这项任务可能并不简单。

其他选项从最简单到最复杂如下:

  1. if... elseif ... else ...在 LS 配置中编写大量语句来捕获每个主机并使用mutate过滤器添加适当的标签。
    这可行,但意味着每次添加/删除主机/服务/客户时都要更改配置。将每个主机放在自己的配置文件中可以稍微简化一些事情,但这仍然意味着每次都要重新启动 LS。

  2. 使用elasticsearch过滤以查询 ES 中具有所需标签的文档,并将它们添加到您正在处理的事件中。
    查询必须经过精心设计,但这可能有效。您需要为每个主机创建特定类型的文档(可能在唯一索引中),以便您的数据始终存在。

  3. 编写自定义过滤器插件,从其他来源提取所需数据。
    有几次,我考虑编写 Redis 过滤器插件来查找无法修改且仅提供特定实体的数字引用的日志源,但我们希望为其提供名称以便于搜索。我不知道这会有多复杂,但应该是可行的。

相关内容