我通过一组记录,其中一个领域是给我的问题的。格式
报头(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.Request-Timestamp=2017-03-24 11:27:56-04
是否有变通方法吗?
对于可变长度逗号分隔的数据,我建议捕获整个组值作为一个场,然后使用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}=
实际的键名/模式为容易嘴馋不匹配一致或可匹配。