如何拆分自定义日志并在logstash上的每个值中添加自定义字段名称

时间:2016-06-16 05:16:20

标签: arrays filter split logstash

我想拆分自定义日志

“2016-05-11 02:38:00.617,userTestId,Key-string-test113321,UID-123,10079,0,30096,128,3”

该日志意味着

Timestamp,String userId,String setlkey,String uniqueId,long providerId,String itemCode1,String itemCode2,String itemCode3,String serviceType

我尝试使用ruby制作过滤器

filter {
        ruby{
        code => "
        fieldArray = event['message'].split(',')
        for field in fieldArray
                result = field
                event[field[0]] = result
end
"
}
}

但我不知道如何通过添加字段名称来拆分日志,每个自定义值如下所示。

Timestamp : 2016-05-11 02:38:00.617
userId : userTestId
setlkey : Key-string-test113321
uniqueId : UID-123
providerId : 10079
itemCode1 : 0
itemCode2 : 30096
itemCode3 : 128
serviceType : 3

我该怎么办?

谢谢你。

1 个答案:

答案 0 :(得分:1)

您可以改用grok过滤器。 grok过滤器使用正则表达式解析该行,您可以将每个组与一个字段相关联 可以使用以下模式解析日志:

grok {
    match => {
        "message" => [
           "%{TIMESTAMP_ISO8601:timestamp},%{USERNAME:userId},%{USERNAME:setlkey},%{USERNAME:uniqueId},%{NUMBER:providerId},%{NUMBER:itemCode1},%{NUMBER:itemCode2},%{NUMBER:itemCode3},%{NUMBER:serviceType}"
        ]
    }
}

这将创建您希望拥有的字段 参考:grok patterns on github
要测试:Grok constructor

另一种解决方案:
您可以使用csv过滤器,它更接近您的需求(但我首先使用grok过滤器,因为我有更多的经验):Csv filter documentation

  

CSV过滤器获取包含CSV数据的事件字段,对其进行分析,并将其存储为单个字段(可以选择指定名称)。此过滤器还可以使用任何分隔符解析数据,而不仅仅是逗号。

我从未使用它,但它看起来应该是这样的:

csv {
   columns => [ "Timestamp", "userId", "setlkey", "uniqueId", "providerId", "itemCode1", "itemCode2 "itemCode3", "serviceType"  ]
}

默认情况下,过滤器位于消息字段中,并带有","分隔符,因此无需对其进行配置。

我认为csv过滤器解决方案更好。