使用 filebeat 和 logstash 标记索引

Tags index with filebeat and logstash

我使用 logstash-forwarder 和 logstash 并使用具有此配置的标签创建动态索引:

/etc/logstash/conf.d/10-output.conf

output {
  elasticsearch {
    hosts => "localhost:9200"
    manage_template => false
    index => "logstash-%{tags}-%{+YYYY.MM.dd}"
  }
}

/etc/logstash-forwarder.conf

"files": [
    {
      "paths": [
        "/var/log/httpd/ssl_access_log",
        "/var/log/httpd/ssl_error_log"
       ],
      "fields": { "type": "apache", "tags": "mytag" }
    },

关联的filebeat配置是:

/etc/filebeat/filebeat.yml

filebeat:
  prospectors:
    -
     paths:
       - /var/log/httpd/access_log
     input_type: log
     document_type: apache
     fields:
       tags: mytag

在 Kibana 中,我在所有索引上都看到了 beats_input_codec_plain_applied,而不是 mytag

[xxxx@yyyy init.d]#猫/etc/filebeat/filebeat.yml

### 由 Puppet 管理的 Filebeat 配置(Ruby 1.8 版本)###

文件拍: spool_size: 1024 publish_async: 错误 idle_timeout:10秒 registry_file:.filebeat config_dir: /etc/filebeat/conf.d

输出: 日志存储: 主持人: - 1.1.1.1:5033

托运人: 标签: - foo-beta

上述指定标签的方式有效,但在 logstash 中您仍然会看到默认值 "beats_input_codec_plain_applied"。不确定如何摆脱它。

默认情况下,在 Filebeat 中,您定义的那些字段会添加到名为 fields 的键下的事件中。要更改此行为并将字段添加到事件的根目录中,您必须设置 fields_under_root: true.

此外,在 Filebeat 5.X 中,tags is a configuration option under the prospector. And this list of tags merges with the global tags configuration. This pull request 包含几个使用 fieldsfields_under_roottags 用于 Beats 5.X 的示例。

以下是您应该如何更改 Filebeat 的配置 1.X:

filebeat:
  prospectors:
    - paths:
        - /var/log/httpd/access_log
      input_type: log
      document_type: apache
      fields:
        tags: ["mytag"]
      fields_under_root: true

我已经解决了向 logstash 插入过滤器的问题:

filter {
    if "beats_input_codec_plain_applied" in [tags] {
        mutate {
            remove_tag => ["beats_input_codec_plain_applied"]
        }
    }
}

我可以看到这个主题中提到的两个问题。为了我自己的利益,让我总结一下,并希望其他也为这个问题而苦苦挣扎的访问者。

  1. 在 filebeat prospector 中添加标签的格式(每个 prospector 标签从 5.0 或 1.2.3 开始可用,正如 a-j 所注意到的)配置

不好:

 fields:
       tags: mytag

好:

 fields:
       tags: ["mytag"]

但是,还有更重要的问题

  1. 正在连接标签。我们希望标签是一个数组,但如果我们将新添加的标签发送到 logstash,我们将看到它们是 ES 中的串联字符串。

如果您只添加一个标签,解决方法(根据 hellb0y77)将删除 filebeat 添加的自动标签,在 logstash(中央服务器端)中:

filter {
    if "beats_input_codec_plain_applied" in [tags] {
        mutate {
            remove_tag => ["beats_input_codec_plain_applied"]
        }
    }
}

如果想在 filebeat 中添加多个标签,这是行不通的。

必须让 logstash 拆分一个连接的字符串并将每个项目添加到标签中。也许在这种情况下会更好,将 filebeat 上的标签放在某个自定义字段中,而不是 "tags" 字段中,然后从 logstash 上的自定义字段中提取它们。

无论如何,似乎没有办法通过更改filebeat配置使其工作。唯一的方法是对接收的 logstash 过滤器链进行一些解析。另见 https://github.com/elastic/filebeat/issues/220

如果您可以删除 logstash,那么这也可能是适合您的解决方案。从filebeat直接发送日志到elasticsearch时,标签如期出现在ES中。