2

我有一个 Docker -> Filebeat -> Elasticsearch 日志管道。

我正在使用 Elasticsearch 摄取管道来处理我的日志(在 Filebeat 发送它们之后)。

在我的日志中,有一个消息字段和有效负载字段。这是有趣的部分:

有效负载有时是对象,有时是字符串。

现在,ES 显然不允许这种类型在映射中发生冲突,所以每天首先进入我的索引的东西都会进入,而另一种类型将无效并引发错误。我想以下列方式处理这个问题:

  1. 检查有效载荷字段的类型
  2. 如果是字符串,则将其嵌套payload.text字段中

我不知道如何进行“嵌套”,也找不到对有效负载字段进行类型检查的方法。

这根本不支持吗?我是否必须为此添加 Logstash?还是可以在 Filebeat 端解决?

编辑:提到摄取管道

4

1 回答 1

0

在您的摄取节点中,您将创建 GROK 过滤器,并根据找到的模式决定将值放在哪里。

记住,如果你想强制字段类型,你可以使用这个结构:

%{FAVORITE_DOG:pet:int}
%{FAVORITE_DOG_text:pet:string}

例如,如果您想解析一个字段并决定根据类型放入两个不同的字段。在这里,我定义了两种不同的模式:

P1(For integers): "My value is=%{NUMBER:my_variable_int:int}"
P2(For text):"My value is=%{WORD:my_variable_text:string}

ps.: %{NUMBER} 和 %{WORD} 是常见的 REGEX 规则

ps2.:顺序很重要,尽量把整数放在第一位,因为字符串总是会被识别...

例子:

log1: "My value is=10"
log2: "My value is=SOME_TEXT"


{
  "description" : "...",
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": ["My value is=%{NUMBER:my_variable_int:int}","My value is=%{WORD:my_variable_text:string}"]
      }
    }
  ]
}

来源:https ://www.elastic.co/guide/en/elasticsearch/reference/master/grok-processor.html

于 2019-08-01T09:59:38.700 回答