1

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

我面临的问题是我无法使用 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)

示例日志需要以 JSON 文件的形式发送到 ElasticSearch,然后保存以供进一步处理。

4

3 回答 3

1

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

https://github.com/whyscream/postfix-grok-patterns/blob/master/50-filter-postfix.conf

于 2017-02-20T15:17:41.523 回答
1

我在这里回答了一个类似的问题,用于使用 Logstash 解析 Postfix 日志,虽然我讨厌链接到另一个答案,但概念保持不变,应该可以帮助您入门,但不涉及Whyscream提供的配置的复杂性。

与 grok 相同的概念也适用于 Fluent。

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

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

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

于 2017-02-23T08:22:37.853 回答
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 下运行,并且有数十亿个 postfix 日志条目通过它。

于 2018-04-03T21:40:09.727 回答