如何通过命令行工具在 Filebeats 中动态添加字段?

How can I add fields dynamically in Filebeats via the command line tool?

我正在尝试通过 Python 调用命令在 Filebeats 中添加两个动态字段。这些字段本身是在完成一些处理后填充的,因此我无法将其预填充到 .yml 文件中。否则我知道我可以在我的 .yml 文件中包含以下代码:

.
.
processors:
  - add_fields:
      fields:
        field1: "str1"
        field2: "str2"
.
.

因为我无法使用此文件将 field1 或 field2 更改为实际值。我构建了一个如下所示的命令:

filebeat -c /etc/filebeat/config.yml --once --path.data=UUID -E "processors=[{{add_fields: {{fields: [ field1:['foo'], field2:['bar']]}}]"

当我 运行 这个命令时,我得到以下错误: Error: invalid argument "processors=[{add_fields: {fields: [ field1:['foo'], field2:['bar']]}]" for "-E, --E" flag: dictionary expected ',' or '}' when parsing '[{add_fields: {fields: [ field1:['foo'], field2:['bar']]}]'

如何向 Filebeat 动态添加字段?

你可以这样使用它:

filebeat -c /etc/filebeat/config.yml --once --path.data=UUID -E \ 
  processors.0.add_fields.fields={field1:foo} -E processors.0.add_fields.fields={field2:bar}

结果:

{
  "@timestamp": "2020-11-27T01:33:31.124Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.10.0"
  },
  "fields": {
    "field2": "bar",
    "field1": "foo"
  },
(...)
}

可能有一种方法可以破解它以在一个 -E 中传递多个字段,但是您应该更容易在 python 脚本中为 filebeat 生成这种参数和我提供的一样。

另一种方法是用两个 -c config.yml -c config_dynamic.yml 重载 filebeat,其中 config_dynamic.yml 是在调用 filebeat 之前的 运行 时间生成的。内容应该只有处理器定义。 Filebeat 将合并两个配置文件,它应该可以工作。

filebeat_dynamic.yml的例子:

processors:
  - add_fields:
      fields:
        field3: boo

来自 运行宁:

filebeat -c /etc/filebeat/config.yml -c /tmp/filebeat_dynamic.yml --once --path.data=UUID -E \ 
  processors.0.add_fields.fields={field1:foo} -E processors.0.add_fields.fields={field2:bar}

你会得到:

{
  "@timestamp": "2020-11-27T01:38:36.184Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.10.0"
  },
  "fields": {
    "field2": "bar",
    "field1": "foo",
    "field3": "boo"
  },
(...)
}