0

我有一个日志文件,我在下面粘贴了两行:

11 月 26 日 14:20:32 172.16.0.1 日期=2014-11-26 时间=14:18:37 devname=XXXXCCCFFFFF devid=XXXCCVVGFFDD logid=3454363464 type=traffic subtype=forward level=notice vd=root srcip=172.16.1.251 srcport=62032 srcintf="Combo_LAN" dstip=XXXX dstport=X dstintf="wan2" sessionid=16172588 status=close user="XX" group="Open Group" policyid=2 dstcountry="United States" srccountry="Reserved" trandisp=snat transip=XXXX transport=X service=HTTP proto=6 applist="Block_Applications" duration=11 sentbyte=2377 rcvdbyte=784 sentpkt=6 rcvdpkt=7 identidx=5 utmaction=passthrough utmevent=webfilter utmsubtype=ftgd-cat urlcnt =1 主机名="tacoda.at.atwola.com" catdesc="广告"

11 月 26 日 14:20:32 172.16.0.1 日期=2014-11-26 时间=14:18:37 devname=XXXXCCCFFFFF devid=XXXCCVVGFFDD logid=3454363464 type=utm subtype=webfilter eventtype=ftgd_allow level=notice vd="root" policyid=2 identidx=5 sessionid=15536​​743 user="XX" srcip=XXXX srcport=X srcintf="Combo_LAN" dstip=XXXX 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 属于策略中允许的类别" method=domain 类=0 cat=18 catdesc="经纪和交易"

我的问题是,如果列数和顺序是固定的,我可以解析数据。

但是,我如何解析配置文件中的动态列,这样我就不会得到_grokparsefailure

4

2 回答 2

1

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
    }
}
  1. 首先,通过索引起始值获取所有 key=value 对date=
  2. 然后将所有键、值映射到字符串数组。
  3. 使用For循环插入所有值。

我已经尝试了您的日志,并且可以使用该值创建所有对应的字段。希望这可以帮到你

于 2014-11-28T04:52:14.700 回答
1

避免 grokparsefailure 的简单答案是提供与您的输入匹配的有效模式。也就是说,您的问题似乎暗示这些字段并不总是按此顺序指定。给定示例,您应该使用“kv”过滤器将这些键/值对拆分为字段。

于 2014-11-29T08:26:16.990 回答