将文档中的字段拆分为多个字段

时间:2019-04-11 04:26:26

标签: elasticsearch logstash logstash-grok

我在弹性索引中捕获了日志,索引中的变量“ message”包含整个日志消息。我想将该数据拆分为多个字段,例如timstamp,ip等。 注意:使用POST,日志可以直接从我们的应用程序中抽取到Elastic中。

我创建了grok来拆分这些信息,但是我不确定如何实时进行转换。

  {
    "_index" : "logs_exception",
    "_type" : "_doc",
    "_id" : "9RI-BGoBwdzZ5ffB3_Sj",
    "_score" : 2.4795628,
    "_source" : {
      "CorrelationId" : "bd3fc7d6-ca39-44e1-9a59-xxasdasd1",
      "Message" : "2019-04-10 10:36:27,780 [8] ERROR LoggingService.TestConsole.Program [(null)] - System.AppDomainUnloadedException: Attempted to access an unloaded AppDomain."
    }

我们可以创建一个弹性管道来从其中一个索引进料并应用grok并将其推回到另一个索引吗?或最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

最好的方法是将Ingest node配置为在将文档编入es之前对其进行预处理。

在您的情况下,您需要一个Grok Processor来匹配消息字段并将其分成多个字段,下面是一个示例管道定义,其中带有Grok Processor来将文档引入到弹性文件中

{
      "description" : "...",
      "processors": [
        {
          "grok": {
            "field": "message",
            "patterns": ["%{DATESTAMP:timestamp}%{SPACE}%{SPACE}\[(?<misc1>.*)\]%{SPACE}%{WORD:loglevel}%{SPACE}%{JAVACLASS:originator}%{SPACE}\[(?<misc2>.*)\]%{SPACE}%{GREEDYDATA:data}"]
          }
        }
      ]
}

使用上述管道定义后,您的数据将按如下所示编制索引。

{
    "_index" : "logs_exception",
    "_type" : "_doc",
    "_id" : "9RI-BGoBwdzZ5ffB3_Sj",
    "_score" : 2.4795628,
    "_source" : {
      "CorrelationId" : "bd3fc7d6-ca39-44e1-9a59-xxasdasd1",
      "timestamp" : "19-04-10 10:36:27,780",
      "misc1" : 8,
      "loglevel": ERROR,
      "originator": "LoggingService.TestConsole.Program",
      "misc2": (null),
      "data" : "- System.AppDomainUnloadedException: Attempted to access an unloaded AppDomain.",
      "Message" : "2019-04-10 10:36:27,780 [8] ERROR LoggingService.TestConsole.Program [(null)] - System.AppDomainUnloadedException: Attempted to access an unloaded AppDomain."
    }

答案 1 :(得分:0)

您可以使用json过滤器:

Go