3

我正在使用 fluentd、elasticsearch 和 kibana 来组织日志。不幸的是,这些日志不是使用像 apache 这样的任何标准编写的,所以我不得不自己想出格式的正则表达式。我在这里使用此站点来验证它们是否正常工作:http: //fluentular.herokuapp.com/

日志在这里大致有这种格式:

DEBUG:  24.04.2014 16:00:00 [SingleActivityStrategy] Start Activitiy 'barbecue' zu verabeiten.

我使用的格式正则表达式如下:

format /(?<pri>([INFO]|[DEBUG]|[ERROR])+)...(?<date>(\d{2}\.\d{2}\.\d{4})).(?<time>(\d{2}:\d{2}:\d{2})).\[(?<subject>(.*))\].(?<msg>(.*))/ 

现在,根据应该使用正则表达式专门测试 fluentd 行为的网站判断,输出应该是这个:

Record
Key     Value
pri     DEBUG
date    24.04.2014
subject     SingleActivityStrategy
msg     Start Activitiy 'barbecue' zu verabeiten.

相反,我有这个?错误?pri 总是缩写为 DEBU。对于变成 ERRO 的 ERROR 也是如此,只有 INFO 保持 INFO。我对正则表达式不是很有经验,我很难相信这是一个错误,但它仍然让我感到困惑,非常感谢任何帮助。

我不确定我是否可以链接完整的配置文件,因为我个人不拥有这些日志文件,并且我试图将其保持在我的老板不会因为我发布敏感信息而对我生气的水平,但它肯定是需要,我会在问他我能透露多少后稍后发布。

一般来说,日志总是大致如下所示:首先是优先级,即 DEBUG、ERROR 或 INFO,然后是日期,然后是我们所说的主题,它总是写在 [] 中,最后只是一条消息。

这是一个指向我正在使用的格式的流利的链接和一个测试字符串,它以流利的方式产生正确的结果,但不在我的配置文件中:

流利的

抱歉,我无法让它像普通链接一样工作,只需点击即可。

另一个用我的格式和测试字符串测试正则表达式的链接是这个:

http://rubular.com/r/dfXOkQYNXP

tl;博士版本:

我的 td-agent 格式正则表达式切断了最后一个字母,尽管流利说它不应该。我的错还是错误?

4

1 回答 1

2

如果您尝试专门匹配数据,正则表达式的外观:

(INFO|DEBUG|ERROR)\:\s+(\d{2}\.\d{2}\.\d{4})\s(\d{2}:\d{2}:\d{2})\s\[(.*)\](.*)

在您的format字符串中,您使用的是空格....冒号应该在哪里。我不确定为什么这在 Fluentular 中有效,但您应该\:明确匹配值之间的每个空格。

因此,您将使用Fluentd 字段(分组名称)查看以下正则表达式:

(?<pri>(INFO|ERROR|DEBUG))\:\s+(?<date>(\d{2}\.\d{2}\.\d{4}))\s(?<time>(\d{2}:\d{2}:\d{2}))\s\[(?<subject>(.*))\]\s(?<msg>(.*))

意思是你td-agent.conf应该看起来像:

<source> 
  type tail 
  path /var/log/foo/bar.log 
  pos_file /var/log/td-agent/foo-bar.log.pos 
  tag foo.bar 
  format /(?<pri>(INFO|ERROR|DEBUG))\:\s+(?<date>(\d{2}\.\d{2}\.\d{4}))\s(?<time>(\d{2}:\d{2}:\d{2}))\s\[(?<subject>(.*))\]\s(?<msg>(.*))/ 
</source>

我还会比较一下 Logstash 与 Fluentd。我更喜欢 Logstash,因为您创建了 Grok 过滤器来匹配您想要的数据类型,并且由于您提供了一个抽象层,它使您的字段格式化更加容易,但您基本上会得到相同的数据。

当您使用像 Rubular 这样的网站时,我会注意,因为它们对多行匹配等非常讲究。我建议使用 Regexr 之类的东西,它可以提供即时反馈,您也可以设置globalmultiline匹配。

于 2014-05-07T18:51:06.797 回答