我正在使用Postfix,我需要在邮件发送后解析邮件日志。 现在,我一直在尝试使用Fluentd使用tail插件来解析Postfix日志。
我面临的问题是我无法使用tail插件的multiline选项解析它们。我可以使用正则表达式单独解析它们但不能一起解析它们。这可能是因为日志本质上是异步的,并且只要有记录信息,每个进程都会记录到文件中。我打算为此目的编写一个ruby脚本,但这可能需要很长时间。
有没有比为Fluentd编写脚本/自定义插件更好的解决方案,因为我不知道Ruby / Perl?
我不关心从以下日期提取信息的日志:
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,然后将其保存以供进一步处理。
答案 0 :(得分:1)
如果您只需跟踪邮件是否已发送。您可以使用Postfix队列ID (日志中的1733D16A90A)作为elasticsearch中的索引键。然后你必须用grok解析每一行并更新你的条目的状态。 看一下grok模式的这个例子:
https://github.com/whyscream/postfix-grok-patterns/blob/master/50-filter-postfix.conf
答案 1 :(得分:1)
我已经回答了一个类似的问题here用Logstash解析Postfix日志,虽然我讨厌链接到另一个答案,但概念保持不变并且应该让你开始,但不要涉及配置的复杂性提供whyscream。
与grok相同的概念也适用于Fluent。
最好的选择是用于读取文件的file输入插件。这将确保您不必担心多行处理,而是可以专注于每一行必要信息。
input {
file {
path => "/var/log/maillog"
type => "postfix" # You can define a type however you like.
}
}
最终,如果可能,您应该尽量避免编写自定义脚本。 Logstash,Fluent和其他类似工具社区已经开展了这样做所需的工作。管理数千条粒度日志的正则表达式至多是一种烦恼。
答案 2 :(得分:1)
几年前我完全需要这个,所以我写了log-ship-elastic-postfix。从我的描述:
改变这些:
Jul 26 04:18:34 mx12 postfix/pickup[20280]: 3mfHGL1r9gzyQP: uid=1208 from=<system>
Jul 26 04:18:34 mx12 postfix/cleanup[20659]: 3mfHGL1r9gzyQP: message-id=<3mfHGL1r9gzyQP@mx15.example.net>
Jul 26 04:18:34 mx12 postfix/qmgr[28761]: 3mfHGL1r9gzyQP: from=<system>, size=813, nrcpt=1 (queue active)
Jul 26 04:18:34 mx12 postfix/smtp[20662]: 3mfHGL1r9gzyQP: to=<system>, relay=127.0.0.2[127.0.0.2]:25, delay=0.53, delays=0.13/0/0.23/0.16, dsn=2.0.0, status=sent (250 Queued! (#2.0.0))
Jul 26 04:18:34 mx12 postfix/qmgr[28761]: 3mfHGL1r9gzyQP: removed
进入这个:
{
"id": "3mfHGL1r9gzyQP",
"host": "mx12",
"events": [
{
"date": "2015-07-26T04:18:34-04:00",
"action": "queued"
},
{
"to": "system",
"relay": "127.0.0.2[127.0.0.2]:25",
"dsn": "2.0.0",
"status": "sent (250 Queued! (#2.0.0))",
"date": "2015-07-26T04:18:34-04:00"
},
{
"date": "2015-07-26T04:18:34-04:00",
"action": "removed"
}
],
"date": "2015-07-26T04:18:34-04:00",
"isFinal": true,
"uid": "1208",
"message-id": "3mfHGL1r9gzyQP@mx15.example.net",
"from": "system",
"size": "813",
"nrcpt": "1",
"delay": "0.53",
"delays": "0.13/0/0.23/0.16"
}
它在node.js下运行,并且有数十亿个后缀日志条目通过它。