我想拆分自定义日志
“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
我该怎么办?
谢谢你。
答案 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过滤器解决方案更好。