目标是:对于日志中的每一行,应该有一个弹性文档,其中包含'message'(时间戳后的文本) . 每个文档还应包含项目名称,计划名称和构建#的字段 . <--this is where I'm getting stuck
开头的示例日志结构(atlassian bamboo build logs):
simple 01-Jan-2016 14:26:01 Build TestProj - Framework Code - Build #25 (TST-FC-25) started building on agent .NET Core 2
simple 01-Jan-2016 14:26:01 .NET-related builds, tests and publishing.
我有一个Grok来获取并创建我想要的字段 - 构建名称,构建号和项目名称(并将它们作为Kibana中的字段):
%{NOTSPACE:log_entrytype}%{SPACE}(?<timestamp>(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])-\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b-(?>\d\d){1,2}\s*(?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9]))%{SPACE}Build%{SPACE}%{DATA:BamProjName}%{SPACE}-%{SPACE}%{DATA:BamBuildName}%{SPACE}-%{SPACE}Build%{SPACE}#%{NUMBER:BamBuildNum}
但是我需要在Kibana的每个记录/条目中提供这些字段 . 使用其他Grok,我可以将日志的其他行提取到log_message字段中:
grok { [
"message", "%{NOTSPACE:log_entrytype}%{SPACE}(?<timestamp>(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])-\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b-(?>\d\d){1,2}\s*(?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9]))%{SPACE}%{GREEDYDATA:log_message}"
]
}
所以我需要以某种方式将这两个模式匹配合并为一个,使用'optional' :()?这里描述的语法是什么?:link
使用logstash和Grok插件可以实现我的最终目标吗?我可以在logstash中使用某种类型的变量构造来处理它吗? add_field?
***注意:使用filebeat发送日志,elastic does not recommend the multiline codec,所以我很好奇我的其他选择是什么
1 回答
您需要使用多行事件,请查看官方文档:https://www.elastic.co/guide/en/logstash/current/multiline.html