我正在运行一个 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
。我打算推动etcd
并confd
制定一个更具适应性的解决方案。
这意味着事件在进入 elasticsearch 时已被“标记”,而且由于我的 logstash 引擎是分布式和自主的,因此无论如何运行“缓存”列表都是可取的。我的主机列表变化不够快,这是一个问题。
答案2
您说您使用 Logstash 的syslog
输入插件作为主机本地 syslog 守护进程的目标。
假设每个主机的系统日志守护程序也将日志条目写入文件,则可以使用Filebeat将这些文件推送到 LS,并在源处添加正确的标签。根据您拥有的主机数量,这项任务可能并不简单。
其他选项从最简单到最复杂如下:
if... elseif ... else ...
在 LS 配置中编写大量语句来捕获每个主机并使用mutate
过滤器添加适当的标签。
这可行,但意味着每次添加/删除主机/服务/客户时都要更改配置。将每个主机放在自己的配置文件中可以稍微简化一些事情,但这仍然意味着每次都要重新启动 LS。使用elasticsearch过滤以查询 ES 中具有所需标签的文档,并将它们添加到您正在处理的事件中。
查询必须经过精心设计,但这可能有效。您需要为每个主机创建特定类型的文档(可能在唯一索引中),以便您的数据始终存在。编写自定义过滤器插件,从其他来源提取所需数据。
有几次,我考虑编写 Redis 过滤器插件来查找无法修改且仅提供特定实体的数字引用的日志源,但我们希望为其提供名称以便于搜索。我不知道这会有多复杂,但应该是可行的。