pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


メールログからPostfix のログだけを抜き出してメールの処理順にソートして並べるスクリプト

複数のメールが同時に処理されている状況のログって非常に見づらいから、処理順に並べるスクリプトを書いてみました。postfix 以外のログは落としているので見易さもアップします。

これに加えてメールログに着色するスクリプトを組み合わせればログ解析が捗ります。

#!/usr/bin/awk -f
#
# メールログから postfix のログだけを抜き出して
# メールの処理順に並べるスクリプトのテスト

$5 ~ /postfix/ {
        pid=$5
        queueid=$6
        status=$7
        queueid_stack[pid] += 0

        # warning や connect 等ではない文字列がキューIDの個所に出現したら、
        # それをキューIDとみなす
        if (    queueid_stack[pid] > 0 &&
                queueid !~ /^warning/ &&
                queueid !~ /^connect/ &&
                queueid !~ /^disconnect/ &&
                queueid !~ /~lost/ ) {
                for ( i = 0 ; i < queueid_stack[pid] ; i++ ) {
                        maillog[queueid,i]=connectlog[pid,i]
                        delete connectlog[pid,i]
                }
                queueid_count[queueid]=queueid_stack[pid]
#               queueid_stack[pid] = queueid
        }

        if ( queueid ~ /^warning/ || queueid ~ /^connect/ ) {
                # warning や connect の時点では QUEIEID が紐づかないので、
                # 行をそのまま一旦バッファリングする
                # このときにログに出現する "postfix/smtpd[PID]:" の文字列を
                # 識別用に用いる。
                queueid_stack[pid]+=0
                connectlog[pid,queueid_stack[pid]]=$0
                queueid_stack[pid]++
        } else if ( queueid ~ /^disconnect/ ) {
                # diconnect は QUEIEID が紐づかないので一旦バッファリングする
                queueid_count[queueid_stack[pid]]++
                maillog[queueid_stack[pid],queueid_count[queueid_stack[pid]]]=$0

                # NOQUEUE は removed と同じ扱いとする。
                if ( queueid_stack[pid] == "NOQUEUE:" ) {
                        queueid=queueid_stack[pid]
                        status = "removed"
                }
                delete queueid_stack[pid]

        } else {
                queueid_count[queueid]++
                maillog[queueid,queueid_count[queueid]]=$0
        }

        # ステータスが removed まで来たら、
        # 一連のメールログをまとめて吐きだす。
        if ( status == "removed" ) {
                for ( i = 0 ; i < queueid_count[queueid]; i++ ) {
                        print maillog[queueid,i]
                        delete maillog[queueid,i]
                }
                printf "%s\n\n",$0
                delete queueid_count[queueid]
                fflush()
        }
}