読者です 読者をやめる 読者になる 読者になる

PostfixのmaillogのFromとToを結合する。

PostfixのmaillogのFromとToを結合する。

Postfixのログを調べるときに一つのメールの行方を追うだけならすごく簡単だが、 複数まとめて検索したいときに面倒くさいのはログ上のFromとToが別の行になっていることだろう。

Feb  9 17:32:04 server001 postfix/qmgr[27385]: 000E21A124F: from=<test@example.com>, size=2414, nrcpt=2 (queue active)
Feb  9 17:32:04 server001 postfix/smtp[7790]: 000E21A124F: to=<test@example.com>, relay=1.1.1.1[1.1.1.1]:25, delay=0.11, delays=0.04/0/0/0.06, dsn=2.0.0, status=sent (250 2.0.0 589c29044d9318 Message accepted for delivery)
Feb  9 17:32:04 server001 postfix/smtp[7790]: 000E21A124F: to=<test@example.com>, relay=1.1.1.1[1.1.1.1]:25, delay=0.11, delays=0.04/0/0/0.06, dsn=2.0.0, status=sent (250 2.0.0 589c29044d9318 Message accepted for delivery)
Feb  9 17:32:04 server001 postfix/qmgr[27385]: 000E21A124F: removed

ちなみに一つのメールのログはqueueidで紐づいている。 この例の場合は 000E21A124F がqueueidである。

泥臭い方法で実装するならば、queueidを全て抜きだして、その数だけgrepして結果を加工する方法がある。 当然ながら時間がかかりすぎる。

join コマンドを利用することでもう少し賢くできる。

こんな感じにする。

$ sudo grep ': from' /var/log/maillog | awk '{print $6,$7}' | sort > from.txt
$ sudo grep ': to' /var/log/maillog | awk '{print $6,$7,$12}' | sort > to.txt
$ join from.txt to.txt

fromもtoも$6にはqueueidが入る。 joinは先頭が一致する行同士を結合してくれる。

問題としては、queueidは使いまわされることがあり、1日ぐらい経つと同じものが使われていることがある。 毎日ログをローテションするなりすれば良いと思われる。その場合に日をまたいだメールとかがあると取りこぼすのも注意が必要。 そしてその場合もqueueidに日付文字列を加えれて複数の日付のログを一度に処理することで問題が解決される気がする。