Logstash过滤系统日志主机组?

我已经运行了一个Elasticsearch / Logstash / Kibana实例,我正在用来自各种主机的系统日志。

通过构build它来扩展规模 – 使用多个logstash syslogd监听器和多个ES节点 – 在整个大型服务器组合中整理日志logging方面做得相当不错。

我现在只有一个问题 – 分组主机。 我可以根据我的configuration数据库 – 物理位置,“服务”,“客户”等各种标准获取主机分组的数据集。

我真的希望能够在我的elasticsearch数据库中添加这些过滤条件,如果可能的话,我可以在Kibana中使用它们,而不需要做太多的修改。

目前我正在想:

  • 一个自定义logstashfilter,在数据转储中查找主机名,并添加标签(真的,服务/客户/位置是我真正需要的)。
  • 尝试为“主机”文档添加父/子关系。
  • 使用“filter”来交叉引用(不知何故?)
  • 一个'脚本'字段?
  • 某些涉及cron作业的肮脏的黑客工作,以元数据后摄入更新logging。

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

在做了一些挖掘之后,我最终决定的解决scheme是使用logstash插件“filter-translate”

这需要带有键值的YAML文件,并且可以根据它重写input日志条目。

所以:

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

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

 hostname : group hostname2 : group 

此刻,它是静态的,并通过cron重build和获取。 我打算推动etcdconfd做一个更适应性的解决scheme。

这意味着,事件在进入elasticsearch时已经被“标记”了,而且因为我的logstash引擎是分布式的并且是自治的,所以无论如何都要运行“caching”列表。 我的主机列表速度不够快,这是一个问题。

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

假设每个主机的syslog守护进程也将日志条目写入文件,则可以使用Filebeat将这些文件推送到LS,在源文件中添加正确的标记。 根据你拥有的主机数量,这个任务可能是不平凡的。

其他选项最简单到最复杂:

  1. 在你的LSconfiguration文件中写一个if... elseif ... else ...语句来捕获每个主机,并用mutatefilter添加适当的标签。
    这工作,但意味着每次添加/删除主机/服务/客户时更改您的configuration。 让每个主机都在自己的configuration文件中简化了一些事情,但是这仍然意味着每次重新启动LS。

  2. 使用elasticsearchfilter查询ES中包含所需标签的文档,并将其添加到正在处理的事件中。
    查询将不得不相当精心制作,但这可能工作。 您需要为每个主机创build特定types的文档,可能在一个唯一的索引中,以便您的数据始终存在。

  3. 编写一个自定义的filter插件,从其他来源提取您需要的数据。
    有几次,我想过编写一个Redisfilter插件来执行对日志源的查找,这些日志源是无法修改的,只为某些实体提供数字引用,但是为了便于search,我们只需要提供名称。 我不知道这会如何,但应该是可行的。