我正在解析一组日志,其中一个字段给我带来问题。 格式为
标题(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.Request-Timestamp=2017-03-24 11:27:56-04
有解决方法吗?
答案 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}=
,因为这很容易引发不匹配。