我有日志文件,我在下面粘贴了两行:
11 月 26 日 14:20:32 172.16.0.1 日期=2014-11-26时间=14:18:37 devname=XXXXCCCFFFFF devid=XXXCCVVGFFDD logid=3454363464 类型=流量子类型=转发级别=注意 vd=根 srcip=172.16.1.251 srcport=62032 srcintf="Combo_LAN" dstip=X.X.X.X dstport=X dstintf="wan2" sessionid=16172588 status=close user="X.X" group="Open Group" policyid=2 dstcountry="United States" srccountry="Reserved" trandisp=snat transip=X.X.X.X 传输=X service=HTTP proto=6 applist="Block_Applications" duration=11sentbyte=2377 rcvdbyte=784 sentpkt=6 rcvdpkt=7 identidx=5 utmaction=passthrough utmevent=webfilter utmsubtype=ftgd-cat urlcnt=1 hostname="tacoda.at.atwola.com" catdesc="Advertising"
11 月 26 日 14:20:32172.16.0.1 日期=2014-11-26 时间=14:18:37 devname=XXXXCCCFFFFF devid=XXXCCVVGFFDD logid=3454363464 type=utm 子类型=webfilter 事件类型=ftgd_allow 级别=注意 vd="root" policyid=2 identidx=5 sessionid=15536743 user="X.X" srcip=X.X.X.X SRCPORT=X srcintf="Combo_LAN" dstip=X.X.X.X dstport=80 dstintf="wan2" service="http" hostname="streaming.sbismart.com" profiletype="Webfilter_Profile" profile="Open Group_Policy" status="passthrough" reqtype="direct" url="/diffusion/" sentbyte=984 rcvdbyte=202 msg="URL 属于策略中允许的类别" 方法=域 类=0 cat=18 catdesc="经纪和交易"
我的问题是,如果列数和顺序是固定的,我可以解析数据。
但是,如何解析配置文件中的动态列,以免获得_grokparsefailure
?
Ruby
插件可以为您提供帮助。
以下是配置:
input {
stdin{
}
}
filter {
ruby {
code => '
msg = event["message"]
msgIndex = msg.index("date=")
msgInsert = msg[msgIndex..-1]
msgMap = msgInsert.scan(/(w+)=("(.*?)"|([^ ]+))/).map { |(first, second)| [first, second] }
for x in msgMap
key = x[0]
value = x[1]
event[key] = value
end
'
}
}
output {
stdout{
codec => rubydebug
}
}
- 首先,通过索引获取所有键=值对起始值
date=
- 然后将所有键,值映射到字符串数组。
- 使用循环
For
插入所有值。
我已经尝试了您的日志,我可以使用该值创建所有相应的字段。希望这能帮助你
避免 grokparsefailure 的简单答案是提供与您的输入匹配的有效模式。 也就是说,您的问题似乎暗示字段并不总是按此顺序指定。 给定示例,您应该使用"kv"过滤器将这些键/值对拆分为字段。