我使用Filebeat / Logstash来解析一些日志文件,其中有几行是这样的:
584 +%put Duração Relatório &duracao.;
Duração Relatório 0:00:00.33
使用filebeat,我已将其设置为使用编码windows-1252
和以下正则表达式(在https://regex101.com上测试):
include_lines: ["Duração Relatório.*"]
然而这忽略了这条线。查看日志,我可以看到filebeat忽略了这一行:
filebeat_1 | 2017/11/03 10:35:02.337238 log.go:199: DBG Drop line as it does not match any of the include patterns Duração Relatório 0:00:00.33`
此外,我的logstash转换似乎无法识别毫秒部分:
grok {
match => {
'message' => 'Duração Relatório%{SPACE}%{GREEDYDATA:Duration}'
}
}
grok {
match => {
'source' => '%{GREEDYDATA}/%{GREEDYDATA:docId}'
}
}
ruby {
code => "
h, m, s = event.get('Duration').split(':').map{|str| str.to_i}
event.set('Duration', h*3600 + m*60 + s*1000)
"
}
所以,我的问题是,我做错了什么,我能得到一个正则表达式只获得第二行(字符串+持续时间在HH:MM:SS.sss)?
如何让logstash过滤器也考虑sss
部分?
最好的问候
所以,没有收到正确消息的问题是因为include_lines: ["Duração Relatório.*"]
应该写成include_lines: ['Duração Relatório.*']
然而,当我不想时,我仍然会抓住第一线。我怎样才能确保我只获得字符串+时间?
我尝试在正则表达式上使用管道,但无济于事......
答案 0 :(得分:1)
要查找搜索短语后跟空格的行,然后使用类似时间的子字符串
Duração Relatório\s+\d[\d:.]+
请参阅regex demo。更具体的正则表达式是Duração Relatório\s+\d{1,2}:\d{2}:\d{2}\.\d+
。
\s+
匹配1个以上的空格,\d[\d:.]+
匹配一个数字,然后是1个数字,冒号或/和点。
要将时间字符串拆分为组件,还要考虑小数点分隔符,这是一个点并使用.split(/[.:]/)
而不是.split(':')
(甚至.split(/\W+/)
其中\W+
匹配除字母,数字和下划线之外的任何1个或多个字符。