正则表达式用于Windows-1252编码字符串+(H)H:MM:SS.sss

时间:2017-11-03 10:45:51

标签: regex elasticsearch logstash filebeat

我使用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.*']

然而,当我不想时,我仍然会抓住第一线。我怎样才能确保我只获得字符串+时间?

我尝试在正则表达式上使用管道,但无济于事......

1 个答案:

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

相关问题