Windows-1252 编码字符串 + (H)H:MM:SS.sss 的正则表达式
Regex for Windows-1252 Encoded String + (H)H:MM:SS.sss
我正在使用 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.*']
但是,当我不想听的时候,我仍然在听第一行。我怎样才能确保我只得到字符串+时间?
我试过在正则表达式上使用管道但无济于事...
要查找搜索短语后跟 space(s),然后是类似时间的子字符串的行,请使用
Duração Relatório\s+\d[\d:.]+
参见regex demo. A more specific regex would be Duração Relatório\s+\d{1,2}:\d{2}:\d{2}\.\d+
。
\s+
匹配 1+ 白色 space 和 \d[\d:.]+
匹配一个数字然后 1+ 数字,冒号 or/and 点。
要将时间字符串拆分成组件,还要考虑小数点分隔符,它是一个点,并使用 .split(/[.:]/)
而不是 .split(':')
(甚至 .split(/\W+/)
,其中 \W+
匹配除字母、数字和下划线以外的任何 1 个或多个字符)。
我正在使用 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.*']
但是,当我不想听的时候,我仍然在听第一行。我怎样才能确保我只得到字符串+时间?
我试过在正则表达式上使用管道但无济于事...
要查找搜索短语后跟 space(s),然后是类似时间的子字符串的行,请使用
Duração Relatório\s+\d[\d:.]+
参见regex demo. A more specific regex would be Duração Relatório\s+\d{1,2}:\d{2}:\d{2}\.\d+
。
\s+
匹配 1+ 白色 space 和 \d[\d:.]+
匹配一个数字然后 1+ 数字,冒号 or/and 点。
要将时间字符串拆分成组件,还要考虑小数点分隔符,它是一个点,并使用 .split(/[.:]/)
而不是 .split(':')
(甚至 .split(/\W+/)
,其中 \W+
匹配除字母、数字和下划线以外的任何 1 个或多个字符)。