【问题标题】:Getting IP address of Logstash-forwarder machine获取 Logstash-forwarder 机器的 IP 地址
【发布时间】:2014-11-17 10:55:47
【问题描述】:

我已经在我的系统上设置了 Elasticsearch、Logstash、Kibana 日志查看工具。我的配置中现在有 2 台机器(Amazon EC2 实例):

  • 54.251.120.171 - 安装 ELK 的 Logstash-server
  • 54.249.59.224 - Logstash-forwarder - 将“/var/logs/messages”日志发送到 Logstash-server

在 logstash-server 上,这是我的配置(在不同文件中)的样子:-

input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}




filter {
 if [type] == "syslog" {

    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}


output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
}

在 logstash-forwarder 上,这是我的配置文件的样子,它将 /var/log/messages、/var/log/secure 日志转发到 logstash-server

{
    "network": {
        "servers": [ "54.251.120.171:5000" ],
        "timeout": 15,
        "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
    },

    "files": [
        {
        "paths": [
                "/var/log/messages",
                "/var/log/secure"
        ],
        "fields": { "type": "syslog" }
        }
    ]
}

这是我的 Kibana 界面在从 Elasticsearch 获取索引日志后的样子。

所以我的问题是,如果有日志事件,我需要一种方法来检索 logstash-forwarder 的 IP 地址,即 54.249.59.224。

我问这个问题的原因是在一个真实的场景中,我们可能有很多 logstash-forwarder(比如 10 个),其中所有 10 个都将日志发送到我们的 logstash-server。所以我需要以某种方式标记所有日志事件,以便我可以识别哪个 logstash-server 发送了哪个日志事件。

我需要使用 IP 地址(可能还有其他一些信息)在 Kibana 界面中搜索日志事件。

有人可以帮我做这件事吗? :)

或者如果有人对如何以不同的方式有效地做到这一点有更好的想法,不客气!

【问题讨论】:

    标签: elasticsearch logstash kibana logstash-grok logstash-forwarder


    【解决方案1】:

    您需要修改 Lumberjack 输入过滤器和服务器来执行此操作。请参阅以下差异:

    https://github.com/stanhu/logstash-input-lumberjack/commit/0861c9d95caa46370f17a82353710bc78ea2c82e

    https://github.com/stanhu/logstash-forwarder/commit/b711d273a24ab3fe1b4a7b6005d2f26983cac859

    在这些更改合并到 logstash-forwarder 和 logstash-input-lumberjack 之前,现在使用它的最简单方法是直接修改已安装的文件。如果您使用的是当前的 Debian 软件包,它们在这里:

    /opt/logstash/lib/logstash/inputs/lumberjack.rb
    /opt/logstash/vendor/bundle/jruby/1.9/gems/jls-lumberjack-0.0.20/lib/lumberjack/server.rb
    

    在输入过滤器配置文件(例如/etc/logstash/conf.d/01-lumberjack-input.conf)中,添加:

    client_address_field => "client_address"
    

    您的 logstash 配置应如下所示:

    input {
      lumberjack {
        host => "localhost"
        port => 5000
        type => "logs"
        ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
        ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
        client_address_field => "client_address"
      }
    }
    

    在机器上重新启动logstash,并检查client_address字段现在是否正在添加到每条消息中。

    【讨论】:

      【解决方案2】:

      这就是 'host' 字段(您也复制到 'received_from')的用途。

      【讨论】:

      • 正如您在我附加的 kibana 快照中看到的,received_from 字段报告主机名是“eva-all”,但我希望它报告主机的 IP 地址即'54.249.59.224'你能告诉我如何修改代码来做到这一点。抱歉,我仍然无法完全理解 grok 和过滤器的语法或功能。
      • 我添加了另一台 IP 为“46.137.246.88”的机器,所以 Kibana 基本上是从 2 台机器获取日志(两者的主机名都是 eva-all),所以我不能区分哪个日志来自哪个机器。
      • 正如您在 logstash-forwarder 配置中显示的那样,您可以从托运人那里发送字段。添加另一个字段并为其指定一个值,以便您将其与另一台机器区分开来。您也可以考虑不给您的机器使用相同的主机名。
      • 我明白这一点,我可以添加 {"uniqueId" : "env1"} 和类似的 {"uniqueId" : "env2" } 在logstash托运机的配置中。所以现在我可以根据“env1”或“env2”来区分。如何动态获取该机器的 IP 地址并添加一个类似 {"ipaddr" : ip_addr_value} 的字段,这样我每次向我们的系统添加新机器时都不需要编辑 logstash-forwarder 文件。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2011-07-22
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多