elasticsearch Logstash-JSON解析列表,elasticsearch,logstash,kibana,logstash-grok,elastic-stack,elasticsearch,Logstash,Kibana,Logstash Grok,Elastic Stack" /> elasticsearch Logstash-JSON解析列表,elasticsearch,logstash,kibana,logstash-grok,elastic-stack,elasticsearch,Logstash,Kibana,Logstash Grok,Elastic Stack" />

elasticsearch Logstash-JSON解析列表

elasticsearch Logstash-JSON解析列表,elasticsearch,logstash,kibana,logstash-grok,elastic-stack,elasticsearch,Logstash,Kibana,Logstash Grok,Elastic Stack,我真的很喜欢麋鹿解析日志。然而,我被困在一个需要解析字典列表的地方。以下是我的日志:- IP - - 0.000 0.000 [24/May/2015:06:51:13 +0000] *"POST /c.gif HTTP/1.1"* 200 4 * user_id=UserID&package_name=SomePackageName&model=Titanium+S202&country_code=in&android_id=AndroidID&eT=1

我真的很喜欢麋鹿解析日志。然而,我被困在一个需要解析字典列表的地方。以下是我的日志:-

IP - - 0.000 0.000 [24/May/2015:06:51:13 +0000] *"POST /c.gif HTTP/1.1"* 200 4 * user_id=UserID&package_name=SomePackageName&model=Titanium+S202&country_code=in&android_id=AndroidID&eT=1432450271859&eTz=GMT%2B05%3A30&events=%5B%7B%22eV%22%3A%22com.olx.southasia%22%2C%22eC%22%3A%22appUpdate%22%2C%22eA%22%3A%22app_activated%22%2C%22eTz%22%3A%22GMT%2B05%3A30%22%2C%22eT%22%3A%221432386324909%22%2C%22eL%22%3A%22packageName%22%7D%5D * "-" "-" "-"
上述日志的URL解码版本为

IP - - 0.000 0.000 [24/May/2015:06:51:13  0000] *"POST /c.gif HTTP/1.1"* 200 4 * user_id=UserID&package_name=SomePackageName&model=Titanium S202&country_code=in&android_id=AndroidID&eT=1432450271859&eTz=GMT+05:30&events=[{"eV":"com.olx.southasia","eC":"appUpdate","eA":"app_activated","eTz":"GMT+05:30","eT":"1432386324909","eL":"packageName"}] * "-" "-" "-"
无论我在哪里尝试解析它,它都会显示
\u jsonparsefailure
。我也讨论过这个问题,也讨论过各种论坛,但并没有找到一个完美的解决方案。如何在logstash中解析json列表??如果到目前为止没有任何存在,那么有什么办法可以解决这个问题呢

下面是我的配置文件

filter {
    mutate {
        gsub => [
            "message", "\+", "%20"
        ]
    }

    urldecode{
        field => "message"
    }
    grok {
        match => [
            'message', '%{IP:clientip}%{GREEDYDATA} \[%{GREEDYDATA:timestamp}\] \*"%{WORD:method}%{GREEDYDATA}'
        ]
    }

    kv {
        field_split => "&?"
    }

    json{
        source => "events"
    }

    geoip {
        source => "clientip"
    }
}

这个问题完全是我的问题。即使有相同的日志条目?!有人能理解吗

你可以看到我的答案,但我会为你总结选项e)可能是最好的方法


显然,由于方括号的缘故,您会遇到jsonparsefailure。作为一种解决方法,您可以手动删除它们。在kv之后和json过滤器之前添加以下mutate过滤器:

mutate  {
    gsub => [ "events","\]",""]
    gsub => [ "events","\[",""]
}
但是,对于像
[{“foo”:“bar”}、{“foo”:“bar1”}]
这样的输入,这是不起作用的。因此,这里有4个选项:

选项a)丑陋的gsub

另一个gsub将是一个丑陋的解决方案:

gsub => [ "event","\},\{",","]
但这会消除内在联系,所以我想你不想这么做

选项b)拆分

更好的方法可能是使用拆分过滤器:

split {
    field => "event"
    terminator => ","
}
mutate  {
    gsub => [ "event","\]",""]
    gsub => [ "event","\[",""]
   }
json{
    source=> "event"
}
这将生成多个事件。(第一个使用
foo=bar
,第二个使用
foo1=bar1

选项c)突变分割

您可能希望在一个日志存储事件中包含所有值。如果存在条目,可以使用mutate=>split过滤器生成数组并解析json。不幸的是,您必须为每个条目设置一个条件,因为logstash在其配置中不支持循环

mutate  {
    gsub => [ "event","\]",""]
    gsub => [ "event","\[",""]
    split => [ "event", "," ]
   }

json{
    source=> "event[0]"
    target => "result[0]"
}

if 'event[1]' {
    json{
        source=> "event[1]"
        target => "result[1]"
    }
    if 'event[2]' {
        json{
            source=> "event[2]"
            target => "result[2]"
        }
    }
    # You would have to specify more conditionals if you expect even more dictionaries
}
选项d)卢比1

以下工作(在kv滤波器之后):使用选项e)


更新 选项e)Ruby2

经过一些测试,这可能是最好的方法。在使用kv过滤器后使用此选项:

ruby  {
    init => "require 'json'"
    code => "event['result'] = JSON.parse(event['event'])"
}

kv{}过滤器应该为您创建一个名为“events”的字段,其中包含json。是吗?是的,是的。但是这并没有解析
事件的列表值,我理解这一点,但是如果kv{}不起作用,json{}就不会有任何要处理的输入。如果将kv{}过滤器后面的“event”值传递给json验证器,是否正确?是的,是否正确。json筛选器成功地以
{“foo”:“bar”}
的形式解析json,但它无法解析的json是
[{“foo”:“bar”}]
ruby  {
    init => "require 'json'"
    code => "event['result'] = JSON.parse(event['event'])"
}