【问题标题】:How can Logstash find out the name of the host where a log came from?Logstash 如何找出日志来自的主机的名称?
【发布时间】:2016-07-07 17:07:23
【问题描述】:

这听起来应该很容易——我确定我不是第一个遇到这个问题的人。所以我肯定遗漏了一些明显的东西。

我正在设置一个 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 看到“主机名”命令显示的相同名称。那可能吗?或者我能否以某种方式让日志发送应用程序将它们的主机名显式添加到它们发送的数据中?

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

【问题讨论】:

    标签: logging dns logstash monitoring elastic-stack


    【解决方案1】:

    Logstash 找不到远程机器的主机名,在日志中包含此信息的方法是在将日志发送到 Logstash 之前将其添加到主机。

    Filebeat 是一种用于获取日志文件并将其发送到 Logstash 的日志传送工具,它在发送事件之前将信息添加到事件中,因此如果您的应用程序记录到文件,我建议您查看 Filebeat。

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

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

    【讨论】:

    • Filebeat 比在每台主机上运行单独的 Logstash 实例(都将日志发送到同一个 Elasticsearch 实例)有什么优势?
    • 在一个 Logstash 中的一个地方完成所有处理,Filebeat 是一个小型 Go 应用程序,而不是一个巨大的 JVM 应用程序与您的应用程序竞争资源
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多