当前位置: 首页 > 面试题库 >

在Logstash中使用grok解析多行JSON

孟财
2023-03-14
问题内容

我有一个格式的JSON:

{
    "SOURCE":"Source A",
    "Model":"ModelABC",
    "Qty":"3"
}

我正在尝试使用logstash解析此JSON。基本上,我希望Logstash输出是可以使用kibana进行分析的key:value对的列表。我认为可以开箱即用。从大量的阅读中,我了解到我必须使用grok插件(我仍然不确定json插件的用途)。但是我无法获得所有领域的事件。我收到多个事件(甚至对于JSON的每个属性都一个)。像这样:

{
       "message" => "  \"SOURCE\": \"Source A\",",
      "@version" => "1",
    "@timestamp" => "2014-08-31T01:26:23.432Z",
          "type" => "my-json",
          "tags" => [
        [0] "tag-json"
    ],
          "host" => "myserver.example.com",
          "path" => "/opt/mount/ELK/json/mytestjson.json"
}
{
       "message" => "  \"Model\": \"ModelABC\",",
      "@version" => "1",
    "@timestamp" => "2014-08-31T01:26:23.438Z",
          "type" => "my-json",
          "tags" => [
        [0] "tag-json"
    ],
          "host" => "myserver.example.com",
          "path" => "/opt/mount/ELK/json/mytestjson.json"
}
{
       "message" => "  \"Qty\": \"3\",",
      "@version" => "1",
    "@timestamp" => "2014-08-31T01:26:23.438Z",
          "type" => "my-json",
          "tags" => [
        [0] "tag-json"
    ],
          "host" => "myserver.example.com",
          "path" => "/opt/mount/ELK/json/mytestjson.json"
}

我应该使用多行编解码器还是json_lines编解码器?如果是这样,我该怎么做?我是否需要编写自己的grok模式,或者是否有JSON通用的东西,可以为我在上述一个事件中获得的key:value对提供一个事件?我找不到任何可以说明这一点的文档。任何帮助,将不胜感激。我的配置文件如下所示:

input
{
        file
        {
                type => "my-json"
                path => ["/opt/mount/ELK/json/mytestjson.json"]
                codec => json
                tags => "tag-json"
        }
}

filter
{
   if [type] == "my-json"
   {
        date { locale => "en"  match => [ "RECEIVE-TIMESTAMP", "yyyy-mm-dd HH:mm:ss" ] }
   }
}

output
{
        elasticsearch
        {
                host => localhost
        }
        stdout { codec => rubydebug }
}

问题答案:

我想我找到了解决我问题的可行方法。我不确定这是否是一种干净的解决方案,但它有助于解析上述类型的多行JSON。

input 
{   
    file 
    {
        codec => multiline
        {
            pattern => '^\{'
            negate => true
            what => previous                
        }
        path => ["/opt/mount/ELK/json/*.json"]
        start_position => "beginning"
        sincedb_path => "/dev/null"
        exclude => "*.gz"
    }
}

filter 
{
    mutate
    {
        replace => [ "message", "%{message}}" ]
        gsub => [ 'message','\n','']
    }
    if [message] =~ /^{.*}$/ 
    {
        json { source => message }
    }

}

output 
{ 
    stdout { codec => rubydebug }
}

我的多行编码解码器无法处理最后一个花括号,因此不会以JSON形式出现json { source => message }。因此,mutate过滤器:

replace => [ "message", "%{message}}" ]

那增加了缺少的括号。和

gsub => [ 'message','\n','']

删除\n引入的字符。最后,我有一个单行JSON,可以读取json { source => message }

如果有一种更干净/更简便的方法将原始的多行JSON转换为单行JSON,请执行POST,因为我觉得上述内容不太干净。



 类似资料:
  • 问题内容: 我有一个看起来像这样的日志文件(简化) Logline样本 我想提取 数据中 包含的json 并创建两个字段,一个用于名字,一个用于姓氏。但是,我得到的输出是这样的: 如你看到的 那不是我所需要的,我需要在kibana中为firstname和lastname创建字段,但是logstash不会使用json过滤器提取字段。 LogStash配置 非常感谢任何帮助,我敢肯定我错过了一些简单的

  • 问题内容: 我的s3存储桶中有多行XML文件(约800行),我想在Elasticsearch中对其进行索引,但无法在logstash中对其进行解析。字段有时为空,因此无法手动分析文件。 我的xml看起来像: 在我的输入中,我有配置: 在我的过滤器中,以下配置: 问题答案: 好的,看起来好像是问题所在,您对多行编解码器和XML过滤器感到困惑。 我可以建议您设置多行: 这将采用 不 包含此标记的任何行

  • 我正在使用Logstash转发器从远程服务器接收Log4j生成的日志文件。log事件的字段包括一个名为“file”的字段,格式为/tomcat/logs/app.log、/tomcat/logs/app.log.1等。当然,文件路径/tomcat/logs位于远程计算机上,我希望Logstash仅使用文件名而不使用远程文件路径在本地文件系统上创建文件。 Logstash配置-我用什么来编写过滤器部

  • 问题内容: 是一个浮动字段。所提到的索引在elasticsearch中不存在。当使用运行配置文件时,我没有例外。但是,elasticsearch中反映和输入的数据显示了as 的映射。我该如何纠正?以及如何针对多个字段执行此操作? 问题答案: 你有两个问题。首先,您的grok过滤器会在csv过滤器之前列出,并且由于应用了过滤器是为了在应用grok过滤器时不会出现要转换的“基本”字段。 其次,除非您明

  • 问题内容: 我正在尝试从logstash开始,并且我的应用程序具有以下类型的日志。这里的5表示接下来将有5行是针对不同相关事物收集的统计信息。 这些基本上是应用程序统计信息,每行指示大约一个资源。 有没有一种方法可以使用logstash正确解析它,以便可以将其用于elasticsearch? 编辑 : 这是我正在使用的配置,第一组统计信息已正确解析,但在该管道阻塞之后。请注意有150个此类日志,但

  • 我的登录格式如下,它是一个带有嵌套字段的普通json。 如何使用Filebeat和Logstash正确地解析它,以将Kibana中的所有json字段视为单独的(已解析的)字段?我在“message”字段中遇到了一个问题,它嵌套了json字段。我解析一个在“message”中有字符串的事件没有问题,但不是JSON。 我的尝试: [2019-03-08T09:55:47,084][WARN][logs