用Grok捕获逗号分隔的模式

时间:2017-04-07 19:13:31

标签: logstash logstash-grok

我正在解析一组日志,其中一个字段给我带来问题。 格式为

标题(ip,日期等)field1 = data,field2 = data,field3 = data,field4 = data 我有一个通用解析器,读取类似

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

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

subvalue1, subvalue2, subvalue3, 

subvalue1, subvalue2, subvalue3, subvalue4, 

subvalue1, subvalue2, 

并且解析器仅捕获subval1。正如你所看到的那样......存在可变数量的子val,当缺少]时很难捕获它们。

以下是日志创建问题的一个示例:

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

有解决方法吗?

1 个答案:

答案 0 :(得分: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列表与k = v对列表分开像这样:

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

或者打开一个包含[的列表,但不会将其关闭。

编辑:看起来第一个破案就是你所面临的事情。

如果角色部分始终位于同一位置,后跟相同的密钥,则可以使用

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

如果这些kv对在同一排列中是一致的,那么使用这种模式应该有效。如果一个字段完全一致或匹配比.*?更具体的正则表达式你应该使用它,那么使用实际的键名称/模式而不是%{DATA}=,因为这很容易引发不匹配。