Parsing 解析后缀日志并发送到ElasticSearch

Parsing 解析后缀日志并发送到ElasticSearch,parsing,logging,fluentd,postfix,Parsing,Logging,Fluentd,Postfix,我正在使用Postfix,我需要在邮件发送后解析邮件日志。 现在,我一直在尝试使用Fluentd和tail插件解析后缀日志 我面临的问题是,我无法使用tail插件的multiline选项解析它们。我可以使用正则表达式单独解析它们,但不能一起解析。这可能是因为日志本质上是异步的,每个进程在有信息要记录时都会记录到文件中。我计划为此编写一个ruby脚本,但这可能需要很多时间 考虑到我不懂Ruby/Perl,还有比为Fluentd编写脚本/自定义插件更好的解决方案吗 我不想从中提取信息的日志: Jan

我正在使用Postfix,我需要在邮件发送后解析邮件日志。 现在,我一直在尝试使用Fluentd和tail插件解析后缀日志

我面临的问题是,我无法使用tail插件的multiline选项解析它们。我可以使用正则表达式单独解析它们,但不能一起解析。这可能是因为日志本质上是异步的,每个进程在有信息要记录时都会记录到文件中。我计划为此编写一个ruby脚本,但这可能需要很多时间

考虑到我不懂Ruby/Perl,还有比为Fluentd编写脚本/自定义插件更好的解决方案吗

我不想从中提取信息的日志:

Jan  5 09:02:48 localhost postfix/pickup[5501]: 1733D16A90A: uid=0 from=<root>
Jan  5 09:02:51 localhost postfix/qmgr[2596]: 1733D16A90A: removed
Jan  5 09:02:48 localhost postfix/cleanup[5978]: 1733D16A90A: message-id=<20170105140248.1733D16A90A@mail.testserver.com>
Jan  5 09:02:48 localhost postfix/qmgr[2596]: 1733D16A90A: from=<root@mail.testserver.com>, size=460, nrcpt=1 (queue active)
Jan  5 09:02:51 localhost postfix/smtp[5980]: 1733D16A90A: to=<divij.sehgaal7@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.130.27]:25, delay=3.4, delays=0.05/0.01/1.9/1.5, dsn=2.0.0, status=sent (250 2.0.0 OK 1483624971 s11si76004239pgc.259 - gsmtp)
我想从中提取信息的日志:

Jan  5 09:02:48 localhost postfix/pickup[5501]: 1733D16A90A: uid=0 from=<root>
Jan  5 09:02:51 localhost postfix/qmgr[2596]: 1733D16A90A: removed
Jan  5 09:02:48 localhost postfix/cleanup[5978]: 1733D16A90A: message-id=<20170105140248.1733D16A90A@mail.testserver.com>
Jan  5 09:02:48 localhost postfix/qmgr[2596]: 1733D16A90A: from=<root@mail.testserver.com>, size=460, nrcpt=1 (queue active)
Jan  5 09:02:51 localhost postfix/smtp[5980]: 1733D16A90A: to=<divij.sehgaal7@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.130.27]:25, delay=3.4, delays=0.05/0.01/1.9/1.5, dsn=2.0.0, status=sent (250 2.0.0 OK 1483624971 s11si76004239pgc.259 - gsmtp)

示例日志需要作为JSON文件发送到ElasticSearch,然后将其保存以供进一步处理。

如果您只需跟踪邮件是否已发送。您可以使用后缀队列id
(日志中的1733D16A90A)作为elasticsearch中的索引键。然后,您必须用grok解析每一行,并更新条目的状态。 请看这个grok模式示例:


我已经回答了一个类似的问题,关于用Logstash解析后缀日志,虽然我不喜欢链接到另一个答案,但概念仍然是一样的,应该让您开始,但不涉及所提供配置的复杂性

grok的相同概念也适用于Fluent

您最好的选择是用于读取文件的输入插件。这将确保您不必担心多行处理,而是可以专注于每一行必要的信息

input {
    file {
        path => "/var/log/maillog"
        type => "postfix"   # You can define a type however you like.
    }
}

最终,如果可能的话,您应该尽量避免编写自定义脚本。所需的工作已经由Logstash、Fluent和其他类似工具的社区承担。为数千个细粒度日志管理正则表达式充其量只是一件麻烦事。

几年前我就需要它,所以我写了这篇文章。根据我的描述:

这些:

Jul 26 04:18:34 mx12后缀/拾取[20280]:3mfHGL1r9gzyQP:uid=1208 from=
Jul 26 04:18:34 mx12后缀/清除[20659]:3mfHGL1r9gzyQP:消息id=
7月26日04:18:34 mx12后缀/qmgr[28761]:3mfHGL1r9gzyQP:from=,size=813,nrcpt=1(队列活动)
7月26日04:18:34 mx12后缀/smtp[20662]:3mfHGL1r9gzyQP:to=,中继=127.0.0.2[127.0.0.2]:25,延迟=0.53,延迟=0.13/0/0.23/0.16,dsn=2.0.0,状态=sent(250排队!)
7月26日04:18:34 mx12后缀/qmgr[28761]:3mfHGL1r9gzyQP:已删除
为此:

{
“id”:“3mfHGL1r9gzyQP”,
“主机”:“mx12”,
“事件”:[
{
“日期”:“2015-07-26T04:18:34-04:00”,
“操作”:“排队”
},
{
“至”:“系统”,
“继电器”:“127.0.0.2[127.0.0.2]:25”,
“dsn”:“2.0.0”,
“状态”:“已发送(250个排队!(#2.0.0))”,
“日期”:“2015-07-26T04:18:34-04:00”
},
{
“日期”:“2015-07-26T04:18:34-04:00”,
“操作”:“已删除”
}
],
“日期”:“2015-07-26T04:18:34-04:00”,
“isFinal”:正确,
“uid”:“1208”,
“消息id”:”3mfHGL1r9gzyQP@mx15.example.net",
“发件人”:“系统”,
“大小”:“813”,
“nrcpt”:“1”,
“延迟”:“0.53”,
“延迟”:“0.13/0/0.23/0.16”
}

它在node.js下运行,并通过它传递了数十亿个后缀日志条目。

感谢您的回答。尽管如此,我还是编写了一个自定义python脚本,将日志数据导出到我的Elasticsearch索引中,并在找到数据后立即使用QueueID作为键和json中的数据更新文档。这似乎正是我想要它做的。然而,我最终还是使用了Logstash Grok模式来实现这一目的。实际上,我在同一时间也遇到了这个问题,但我们没有使用它,因为我们希望在堆栈中保持较小的多样性,这在node.js下运行。如何使用Logstash模式来做到这一点?当我尝试的时候,甚至都不可能,我想发布一个链接到它。我不会称之为HowTo,但据我记忆所及,我发现这个链接很有用。抱歉,但我不确定是不是这一个,因为我换了工作,没有我以前的代码/我用来保存这些链接的文档来确认这一点。你可能需要自己对这个链接(可能还有其他一些链接)进行一些研究和开发,以确认这确实是一个链接。该链接显示了一些grok模式,可以更好地解析和索引后缀日志条目,但就我所知,您仍然需要处理分布在ES文档集合中的特定消息的所有后缀日志条目。这与将它们全部放在一个格式良好的文档中有很大不同。