【问题标题】:Parsing POSTFIX logs and sending to ElasticSearch解析 POSTFIX 日志并发送到 ElasticSearch
【发布时间】:2017-01-07 19:07:06
【问题描述】:

我正在使用 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,然后保存以供进一步处理。

【问题讨论】:

    标签: parsing logging fluentd postfix


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。虽然,编写了一个自定义 python 脚本,将日志数据导出到我的 Elasticsearch 索引,并在找到数据后立即使用 QueueID 作为键和数据更新文档。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      几年前我正是需要这个,所以我写了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 日志条目通过它。

      【讨论】:

      • 有趣。这似乎完全符合我的要求。但是,我最终为此使用了 Logstash Grok 模式。
      • 实际上我也差不多在同一时间遇到了这个问题,但我们没有使用它,因为我们希望在堆栈中保持较少的多样性,并且它在 node.js 下运行
      • 是否有一个如何使用logstash 模式做到这一点?当我尝试并且我很想发布它的链接时,它甚至不可能回来。
      • 我不会称它为 HowTo,但据我记得,我发现 this 链接很有用。抱歉,但我不确定是不是这个,因为我换了工作并且没有我以前的代码/我用来保存这些链接的文档来确认它。您可能需要在此链接(可能还有其他一些链接)上进行一些自己的研发,以确认这确实是一个。
      • 该链接显示了一些 grok 模式,它们可以更好地解析和索引后缀日志条目,但据我所知,您仍然被所有散布在特定消息的后缀日志条目所困扰ES 文档的集合。这与将它们全部放在一个格式良好的文档中完全不同。
      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 2020-01-18
      • 2021-03-26
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多