【问题标题】:Logstash sprintf formatting for elasticsearch output plugin not working用于弹性搜索输出插件的 Logstash sprintf 格式不起作用
【发布时间】:2018-12-02 05:25:18
【问题描述】:

我在使用 sprintf 引用 elasticsearch 输出插件中的事件字段时遇到问题,我不知道为什么。以下是过滤完成后从 Filebeat 接收并发送到 Elasticsearch 的事件:

{
          "beat" => {
        "hostname" => "ca86fed16953",
            "name" => "ca86fed16953",
         "version" => "6.5.1"
    },
    "@timestamp" => 2018-12-02T05:13:21.879Z,
          "host" => {
        "name" => "ca86fed16953"
    },
          "tags" => [
        [0] "beats_input_codec_plain_applied",
        [1] "_grokparsefailure"
    ],
        "fields" => {
        "env" => "DEV"
    },
        "source" => "/usr/share/filebeat/dockerlogs/logstash_DEV.log",
      "@version" => "1",
    "prospector" => {
        "type" => "log"
    },
        "bgp_id" => "42313900",
       "message" => "{<some message here>}",
        "offset" => 1440990627,
         "input" => {
        "type" => "log"
    },
        "docker" => {
        "container" => {
            "id" => "logstash_DEV.log"
        }
    }
}

我正在尝试根据 filebeat 的环境来索引文件。这是我的配置文件:

input {
  http { }
  beats {
    port => 5044
  }
}

filter {
  grok {
    patterns_dir => ["/usr/share/logstash/pipeline/patterns"]
    break_on_match => false
    match => { "message" => ["%{RUBY_LOGGER}"]
             }
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "%{[fields][env]}-%{+yyyy.MM.dd}"
  }
  stdout { codec => rubydebug }
}

我认为引用的事件字段在到达 elasticsearch 输出插件时已经被填充。但是,在 kibana 端,它没有注册格式化索引。相反,它是这样的:

我做错了什么?

【问题讨论】:

  • 我无法使用行编解码器的格式选项重现您的问题,并且由于我没有安装 ES,因此我无法尝试使用 elasticsearch 输出重现它。但是您可以尝试使用 mutate#copy 过滤器选项将值移动到另一个字段,对于可以使用 %{field_name} 直接访问而没有 [] 的字段,它可能会起作用。
  • @baudsp 感谢您的建议!我意识到,默认情况下,如果使用除 logstash-%{+YYYY.MM.dd} 之外的不同索引名称,elasticsearch 会要求您指定自定义模板。要禁用,我们需要包含 manage_templates => false 键。发布了这个答案
  • 我完全忘记了那个选项。或者从来不知道它会这样做。恭喜!

标签: indexing logstash elastic-stack elasticsearch-plugin logstash-configuration


【解决方案1】:

在 Elasticsearch 输出插件文档中:
https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-manage_template

您是否需要对其他索引名称的支持,或者想要 通常更改模板中的映射,自定义模板可以 通过将模板设置为模板文件的路径来指定。

将 manage_template 设置为 false 会禁用此功能。如果您需要 对模板创建的更多控制,(例如创建索引 根据字段名称动态地)您应该将 manage_template 设置为 false 并使用 REST API 手动应用您的模板。

默认情况下,如果使用除 logstash-%{+YYYY.MM.dd} 之外的不同索引名称,elasticsearch 会要求您指定自定义模板。要禁用,我们需要包含 ma​​nage_template => false 键。

所以有了这组新信息,工作配置应该是:

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "%{[fields][env]}-%{+yyyy.MM.dd}"
    manage_template => false
  }
  stdout { codec => rubydebug }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2018-09-29
    相关资源
    最近更新 更多