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

pslaboの日記

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

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

iPad3のSIMロックに関する考察とSIM下駄による解除の試みはSoftbank版iPad3にiPhone用のSIM下駄を履かせてみるにいろいろ書いてます。

ポストした内容のカテゴリー分けがちゃんと出来てないので、過去記事を探したい方はお手数ですが検索で探してみてください。


メールログから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()
        }
}