这听起来应该很容易 - 我确定我不是第一个遇到这个问题的人。所以我一定错过了一些明显的东西。
我正在设置Logstash实例以从多个应用程序收集日志,每个应用程序都运行在不同的Amazon EC2主机上。
我希望Logstash知道每条日志消息来自的主机的名称,以便触发某些行为(例如使用" grok"来解析仅存在于某个应用程序中的字段&# 39; s日志,或仅针对特定应用程序发送电子邮件警报)。我无法使用日志消息的实际文本,因为每个消息的日志格式都不同。
我以为我可以使用内置的#34;主机"字段,但结果只是一个IP地址。每次收到日志消息时都可以进行反向DNS查找,例如
filter {
mutate {
add_field => { "hostname" => "%{host}" }
}
dns {
action => "replace"
reverse => [ "hostname" ]
add_tag => [ "dns_lookup" ]
}
if "myapplication" in [hostname] {
# do something
}
}
但是它提供了亚马逊基于IP地址的名称之一,如" ip-10-1-1-23.ec2.internal"。
我想要的只是让Logstash看到"主机名"所显示的相同名称。命令。那可能吗?或者我可以以某种方式使日志发送应用程序明确地将其主机名添加到他们发送的数据中吗?
如果它相关,应用程序使用Logstash TCP协议(通过python-logstash)发送其日志,但它们可以轻松使用syslog或任何其他协议。
答案 0 :(得分:1)
Logstash无法找到远程计算机的主机名,在日志中显示此信息的方法是在将日志发送到logstash之前将其添加到主机。
Filebeat是一个日志传送工具,用于获取日志文件并将其发送到Logstash,在发送之前将信息添加到事件中,因此如果您的应用程序登录到文件,我建议您查看Filebeat。
另一种选择是自定义您的日志,以便自己在运输过程的某个地方包含主机名。
无论哪种方式,主机名都应该在发送到logstash之前添加到日志事件中。