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 个或多个字符)。