我正在使用ELK(弹性搜索,kibana,logstash,filebeat)来收集日志。我有一个包含以下行的日志文件,每行都有一个json,我的目标是使用Logstash Grok取出json中的键/值对并将其转发给弹性搜索。
for(var i = 0; i < 20000; i++) {
admin.firestore().collection("someLocation").add({
time: admin.firestore.FieldValue.serverTimestamp()
})
}
我正在使用Grok Debugger制作正则表达式模式并查看结果。我目前的正则表达式是:
2018-03-28 13:23:01 charge:{"oldbalance":5000,"managefee":0,"afterbalance":"5001","cardid":"123456789","txamt":1}
2018-03-28 13:23:01 manage:{"cuurentValue":5000,"payment":0,"newbalance":"5001","posid":"123456789","something":"new2","additionalFields":1}
由于人们可以看到它是硬编码的,因为真实日志中json中的键可以是任何单词,值可以是整数,双精度或字符串,更重要的是,键的长度会有所不同。所以我的解决方案是不可接受的我的解决方案结果如下所示,仅供参考。我正在使用Grok patterns。
我的问题是尝试在json中提取密钥是明智的还是没有,因为弹性搜索也使用json?其次,如果我尝试从json中取出键/值,是否有正确,简洁的Grok模式?
当解析上面一行中的第一行时,Grok模式的当前结果给出以下输出。
%{TIMESTAMP_ISO8601} %{SPACE} %{WORD:$:data}:{%{QUOTEDSTRING:key1}:%{BASE10NUM:value1}[,}]%{QUOTEDSTRING:key2}:%{BASE10NUM:value2}[,}]%{QUOTEDSTRING:key3}:%{QUOTEDSTRING:value3}[,}]%{QUOTEDSTRING:key4}:%{QUOTEDSTRING:value4}[,}]%{QUOTEDSTRING:key5}:%{BASE10NUM:value5}[,}]
第二次修改
是否可以使用Logstash的Json过滤器?但在我的情况下,Json是线/事件的一部分,而不是整个事件是Json。
=============================================== ============
我没有看到解析json的更新解决方案函数。我的正则表达式如下:
{
"TIMESTAMP_ISO8601": [
[
"2018-03-28 13:23:01"
]
],
"YEAR": [
[
"2018"
]
],
"MONTHNUM": [
[
"03"
]
],
"MONTHDAY": [
[
"28"
]
],
"HOUR": [
[
"13",
null
]
],
"MINUTE": [
[
"23",
null
]
],
"SECOND": [
[
"01"
]
],
"ISO8601_TIMEZONE": [
[
null
]
],
"SPACE": [
[
""
]
],
"WORD": [
[
"charge"
]
],
"key1": [
[
""oldbalance""
]
],
"value1": [
[
"5000"
]
],
"key2": [
[
""managefee""
]
],
"value2": [
[
"0"
]
],
"key3": [
[
""afterbalance""
]
],
"value3": [
[
""5001""
]
],
"key4": [
[
""cardid""
]
],
"value4": [
[
""123456789""
]
],
"key5": [
[
""txamt""
]
],
"value5": [
[
"1"
]
]
}
它没有key:value对,而是msg + json string。解析的json未被解析。
测试数据如下:
filter {
grok {
match => {
"message" => [
"%{TIMESTAMP_ISO8601}%{SPACE}%{GREEDYDATA:json_data}"
]
}
}
}
filter {
json{
source => "json_data"
target => "parsed_json"
}
}
答案 0 :(得分:2)
您可以使用GREEDYDATA
将整个json块分配到一个单独的字段,
%{TIMESTAMP_ISO8601}%{SPACE}%{GREEDYDATA:json_data}
这将为您的json数据创建一个单独的文件,
{
"TIMESTAMP_ISO8601": [
[
"2018-03-28 13:23:01"
]
],
"json_data": [
[
"charge:{"oldbalance":5000,"managefee":0,"afterbalance":"5001","cardid":"123456789","txamt":1}"
]
]
}
然后在json_data
字段上应用json filter,如下所示,
json{
source => "json_data"
target => "parsed_json"
}