2016-07-07 327 views
1

这听起来应该很简单 - 我确定我不是第一个有这个问题的人。所以我必须错过一些明显的东西。Logstash如何找出日志来自的主机的名称?

我正在设置一个Logstash实例来从多个应用程序收集日志,每个应用程序都运行在不同的Amazon EC2主机上。

我希望Logstash知道每个日志消息来自哪里的主机的名称,以便触发某些行为(例如使用“grok”来解析仅存在于特定应用程序日志中的字段,或者发送电子邮件仅针对某个应用程序发出警报)。我无法使用日志消息的实际文本,因为每个日志消息的格式不同。

我以为我可以使用内置的“主机”字段,但事实证明这只是一个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看到“hostname”命令显示的同名。那可能吗?或者我可以以某种方式使日志发送应用程序显式地将他们的主机名添加到他们发送的数据中?

如果相关,应用程序使用Logstash TCP协议(通过python-logstash)发送它们的日志,但它们是否可以轻松使用syslog或任何其他协议。

回答

1

Logstash无法找到远程计算机的主机名,在日志中获取此信息的方法是在将日志发送到logstash之前将其添加到主机。

Filebeat是一种用于取得日志文件并将它们发送到Logstash的日志传送工具,它在发送事件之前将这些信息添加到事件中,所以如果您的应用程序登录到文件,我建议检查Filebeat。

另一种选择是自定义日志,以便自己在运输过程中的某个位置包含主机名。

无论采用哪种方式,主机名都应该在发送到logstash之前添加到日志事件中。

+0

Filebeat在每个主机上运行单独的Logstash实例的优点是什么(所有的日志都发送到同一个Elasticsearch实例)? – gesgsklw

+2

在一个Logstash中完成所有处理,而Filebeat是一个小型的Go应用程序,而不是一个巨大的JVM应用程序与您的应用程序竞争资源 –