Postfixのログをfluentdを使ってTreasureDataに送る

こんにちは、SSTDの髙橋です。 前回の更新から日が空いてしまいましたが、引き続き継続して情報発信をしていきたいと思います。

さて、社内メールにGmailなどのクラウドサービスを使うことは一般的になってきましたが、それでも社内メールサーバと連携することは一般的です。 そうした中で、メールサーバに障害が発生した際に、SSHしてメールサーバのログを必死に読み解いていくはなかなか面倒です。 そこで今回は、Postfixのログをfluentdを使ってTreasureDataに送ってみたいと思います(td-agentをご利用の方はfluentdの箇所をtd-agentと読み替えて御試し下さい)。


実行環境

Postfixやfluentdの設定は既に設定済みであるとします。
  • Mac OS 10.9.4
  • Postfix 2.9.4
    • smtpにはgmailを設定済
  • fluentd 0.10.52
    • fluent-plugin-multi-format-parser 0.0.1
    • td 0.11.2


Postfixのログ内容

Postfixから出力されるログは下記に例を示します。 ログを確認すると、一つのログにも複数のフォーマットが混在している点が複雑です。

fluentd.confの内容

複数のフォーマットが混在しているログに対しては、fluent-plugin-multi-format-parserが便利です。 このプラグインによって、postfix/smtpとその他のフォーマットのログも細かめにとれるようにしています。 設定ファイルを下記に示します。設定ファイルの正規表現には、こちらのgistを参考にさせて頂きました。


結果データ

さきほどのログを、上記設定ファイルを使ってファイルに出力した場合のの結果は下記になります。

  • 1番目のPatternでマッチされた結果
2014-08-16T00:39:31+09:00 td.log.mail {"host":"mail.local","ident":"postfix/smtp","pid":"2505","key":"45A22B1F475","address":"takahashi@test.com","relay":"smtp.gmail.com[74.125.25.108]:587","delay":"6","delays":"0.01/0.01/4/2","dsn":"2.0.0","status":"sent (250 2.0.0 OK 1408117171 xq3sm28810269pab.0 - gsmtp)"}
  • 2番目のPatternでマッチされた結果
2014-08-16T00:17:29+09:00 td.log.mail {"host":"mail.local","ident":"postfix/pickup","pid":"2301","message":"668B8B1C353: uid=501 from="}


TreasureData上の結果

結果をTreasureDataに入れた場合は、下図のように格納されます。
  • テーブル情報
  • レコード情報


まとめ

このように一つのログ内に複数のフォーマットが存在する場合でも、fluendを使うことでうまくパースすることができ、それだけでなく、TreasureDataを使うことで長期保存や後での集計が簡単にできるようになりますね。

執筆:髙橋@SSTD