我已经运行了一个Elasticsearch / Logstash / Kibana实例,我正在用来自各种主机的系统日志。
通过构build它来扩展规模 – 使用多个logstash syslogd监听器和多个ES节点 – 在整个大型服务器组合中整理日志logging方面做得相当不错。
我现在只有一个问题 – 分组主机。 我可以根据我的configuration数据库 – 物理位置,“服务”,“客户”等各种标准获取主机分组的数据集。
我真的希望能够在我的elasticsearch数据库中添加这些过滤条件,如果可能的话,我可以在Kibana中使用它们,而不需要做太多的修改。
目前我正在想:
但是我想知道是否有人已经解决了这个问题,并且能够提出一个合理的方法?
在做了一些挖掘之后,我最终决定的解决scheme是使用logstash插件“filter-translate”
这需要带有键值的YAML文件,并且可以根据它重写input日志条目。
所以:
translate { field => "logsource" destination => "host_group" dictionary_path => [ "/logstash/host_groups.dict" ] }
这是一个相当简单的列表:
hostname : group hostname2 : group
此刻,它是静态的,并通过cron
重build和获取。 我打算推动etcd
并confd
做一个更适应性的解决scheme。
这意味着,事件在进入elasticsearch时已经被“标记”了,而且因为我的logstash引擎是分布式的并且是自治的,所以无论如何都要运行“caching”列表。 我的主机列表速度不够快,这是一个问题。
你说你使用Logstash的syslog
input插件作为你的主机本地syslog守护进程的目标。
假设每个主机的syslog守护进程也将日志条目写入文件,则可以使用Filebeat将这些文件推送到LS,在源文件中添加正确的标记。 根据你拥有的主机数量,这个任务可能是不平凡的。
其他选项最简单到最复杂:
在你的LSconfiguration文件中写一个if... elseif ... else ...
语句来捕获每个主机,并用mutate
filter添加适当的标签。
这工作,但意味着每次添加/删除主机/服务/客户时更改您的configuration。 让每个主机都在自己的configuration文件中简化了一些事情,但是这仍然意味着每次重新启动LS。
使用elasticsearchfilter查询ES中包含所需标签的文档,并将其添加到正在处理的事件中。
查询将不得不相当精心制作,但这可能工作。 您需要为每个主机创build特定types的文档,可能在一个唯一的索引中,以便您的数据始终存在。
编写一个自定义的filter插件,从其他来源提取您需要的数据。
有几次,我想过编写一个Redisfilter插件来执行对日志源的查找,这些日志源是无法修改的,只为某些实体提供数字引用,但是为了便于search,我们只需要提供名称。 我不知道这会如何,但应该是可行的。