elasticsearch Logstash筛选器-半行json解析,elasticsearch,logstash,logstash-grok,logstash-configuration,filebeat,elasticsearch,Logstash,Logstash Grok,Logstash Configuration,Filebeat" /> elasticsearch Logstash筛选器-半行json解析,elasticsearch,logstash,logstash-grok,logstash-configuration,filebeat,elasticsearch,Logstash,Logstash Grok,Logstash Configuration,Filebeat" />

elasticsearch Logstash筛选器-半行json解析

elasticsearch Logstash筛选器-半行json解析,elasticsearch,logstash,logstash-grok,logstash-configuration,filebeat,elasticsearch,Logstash,Logstash Grok,Logstash Configuration,Filebeat,我使用“filebeat”作为发货人,客户端将其发送到redis,使用logstash从redis读取并发送到ES 我试图分析以下示例行: 09:24:01.969 watchdog-INFO-100.140.2通过:Mobile:Mobile[].popover[“mc1814”]。选择(2,):706这种部分格式最好在日志存储端处理,而不是发货方。FileBeat中可用的过滤器/转换无法满足这一要求。不过,Logstash过滤器管道是可行的 filter { grok { mat

我使用“filebeat”作为发货人,客户端将其发送到redis,使用logstash从redis读取并发送到ES

我试图分析以下示例行:


09:24:01.969 watchdog-INFO-100.140.2通过:Mobile:Mobile[].popover[“mc1814”]。选择(2,):706这种部分格式最好在日志存储端处理,而不是发货方。FileBeat中可用的过滤器/转换无法满足这一要求。不过,Logstash过滤器管道是可行的

filter {
  grok {
    match => {
      "message" => [ "(?<plain_prefix>^.*?) (?<json_segment>{.*$)"]
    }
  }
  json {
    source => "json_segment"
  }
  mutate {
    remove_field => [ "json_segment" ]
  }
}
过滤器{
格罗克{
匹配=>{
“消息”=>[“(?^.*?({.*$)”]
}
}
json{
source=>“json_段”
}
变异{
删除_字段=>[“json_段”]
}
}
此基本示例将传入消息拆分为两个字段。
plain_前缀
json_段
。然后使用
json{}
过滤器将json数据解析为事件。最后,使用
mutate{}
filter用于从事件中删除
json_段
字段,因为它已经被解析和包含


注意:
普通前缀
中的
*?
在这个过滤器中是至关重要的。这样构造,从第一个
{
开始的所有内容都被认为是JSON段的一部分。如果使用
*
,JSON段将是从最后一个
开始的所有内容{
,这对于复杂的JSON数据结构将是一个问题。

这种部分格式最好在Logstash端处理,而不是由发货人处理。FileBeat中可用的过滤器/转换无法满足这一要求。不过,Logstash过滤器管道是

filter {
  grok {
    match => {
      "message" => [ "(?<plain_prefix>^.*?) (?<json_segment>{.*$)"]
    }
  }
  json {
    source => "json_segment"
  }
  mutate {
    remove_field => [ "json_segment" ]
  }
}
过滤器{
格罗克{
匹配=>{
“消息”=>[“(?^.*?({.*$)”]
}
}
json{
source=>“json_段”
}
变异{
删除_字段=>[“json_段”]
}
}
此基本示例将传入消息拆分为两个字段。
plain_前缀
json_段
。然后使用
json{}
过滤器将json数据解析为事件。最后,使用
mutate{}
filter用于从事件中删除
json_段
字段,因为它已经被解析和包含


注意:
普通前缀
中的
*?
在这个过滤器中是至关重要的。这样构造,从第一个
{
开始的所有内容都被认为是JSON段的一部分。如果使用
*
,JSON段将是从最后一个
开始的所有内容{
,这对于复杂的JSON数据结构来说是一个问题。

感谢您的快速回答,我得到了以下错误:“JSON_错误”:“错误解码JSON:JSON:无法将数字解组到map[string]接口{}类型的Go值中”,它对我不起作用,我使用的是ELK 5.1.1堆栈版本,顺便说一句,有些日志最后没有json。@MosheSaada恐怕没有更多的日志行要看。好吧,它起作用了,但有一些修复:1.grok{match=>{“message”=>[“(?^.*?({“actionDuration”。*$”])}2.json{source=>[“json片段”]}@MosheSaada啊!是的,我在
source=>
部分有一个bug。它应该是一个字符串,而不是像你一样大小为1的字符串数组。感谢你的快速回答,我得到了以下错误:“json_错误”:“错误解码json:json:无法将数字解组到map[string]接口{}类型的Go值中”,它对我不起作用,我使用的是ELK 5.1.1堆栈版本,顺便说一句,有些日志最后没有json。@MosheSaada恐怕没有更多的日志行要看。好吧,它起作用了,但有一些修复:1.grok{match=>{“message”=>[“(?^.*?({“actionDuration”。*$”])}2.json{source=>[“json片段”]}@MosheSaada啊!是的,我在
source=>
部分有一个bug。它应该是一个字符串,而不是像你这样大小为1的字符串数组。