捕捉与神交逗号分隔图案

问题描述 投票:0回答:1

我通过一组记录,其中一个领域是给我的问题的。格式

报头(IP,日期等)字段1 =数据,FIELD2 =数据,字段3 =数据,字段4 =数据I具有读像一般的解析器

match => [ "message","%{DATA:..header..} %{DATA}=%{DATA:service},%{DATA}=%{DATA:roles}],%{DATA}=%{DATA:macaddress},%{DATA}=%{DATA:nasip}"]

有些时候,对“角色”字段中的“价值”的部分看起来像值,[管理]。这是由以%{DATA}处理=%{DATA:角色}],但在其他情况下,我得到

subvalue1, subvalue2, subvalue3, 

要么

subvalue1, subvalue2, subvalue3, subvalue4, 

要么

subvalue1, subvalue2, 

和解析器仅捕获subval1。正如你所看到的..有次瓦尔斯数量可变的,他们都硬]丢失时赶上。

这是什么样的记录生成问题的一个例子:

local1--debug--10.47.130.2--2017-03-24--2017-03-24T11:29:51-‌​04:00--11:29:51,545 10.241.186.253 ZTP0 SESSION 20 1 0 Common.Username=LABF5CHK,Common.Service=F5_HealthCHK,Common.‌​Roles=Employee, [User Authenticated],Common.NAS-IP-Address=xxxxxxxxxxxx,Common.Req‌​uest-Timestamp=2017-‌​03-24 11:27:56-04

是否有变通方法吗?

logstash logstash-grok
1个回答
1
投票

对于可变长度逗号分隔的数据,我建议捕获整个组值作为一个场,然后使用csv filter解析该字段。

解析一组key = value对我建议使用kv filter

所以,你的配置将工作是这样的

filter {
  grok {
    match => [ "message","%{DATA:..header..} %{GREEDYDATA:kv_pairs}"]
  }
  kv {
    source => "kv_pairs"
    field_split => ","
  }
  csv {
    # assumes that the key was 'roles'
    source => "roles"
    target => "role_list"
  }
}

我不知道你的日志消息的确切格式,但KV过滤器,如果你的邮件有一个格式,它不与子值CSV名单从这样ķ= V对的列表分开约可能会搞砸了:

...,key=value,roles=subval1,subval2,subval3,key2=value2...

或打开清单,[,但不会关闭它。

编辑:这看起来好像是第一个打破的情况下,其实你面对什么。

如果角色的部分总是在同一个地方,其次是同一个键,你可以用它搭配

...Common.‌​Roles=%{DATA:roles},Common.NAS-IP-Address=%{DATA:nasip}...

如果这些KV对是consitently以相同的配置,使用这种模式应该工作。如果一个字段是全部由一个更具体的正则表达式比.*?你应该使用,所以使用的,而不是%{DATA}=实际的键名/模式为容易嘴馋不匹配一致或可匹配。

© www.soinside.com 2019 - 2024. All rights reserved.