- ベストアンサー
Sendmailで送受信メールを数えたい
Solaris 7(Sparc) + Sendmail です。1日当たり何通のメールが 送受信されているか知りたいのですが: Jul 7 03:22:13 mail sendmail[12119]: DAA12119: ===以下略=== syslogの第6フィールド「DAA12119」の部分で、一意なものだけ の数が、送受信されたメールの数に一致するのでしょうか? また、第5(sendmail[12119]:)、第6フィールド(DAA12119) の意味の違いは何でしょうか? もしくは、他にメール数をカウントするより良い手段がある場合 ご教授願います(root権限使用可能)。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>実は私もfrom/toから、社内間、社内->社外、社外->社内ごとに >集計したくてsyslogを見ていました。 >kanop_98さんは、そのような集計をやられていますか? > 自分はfromとtoそれぞれ集計してます。 なのでfromとtoを連携させた「社内間」と「社外→社内」の区別はしてません。 「どこから何通受信」「どこに何通送信」がわかれば ある程度は見えてくると思います。 で、貧弱な方法なのであまり参考にしてほしくないですが...^ ^;; 昔は単にgrep -cでカウントしてましたが、よけいな部分までカウントする事があったので、 今はperl使って集計してます。 syslogのfromとtoの部分のみをそれぞれ一時ファイルとして抽出し、 それらのファイルから内部ドメインとそれ以外(外部)の単語数を集計しているだけです。 キューIDやPIDは一切無視です。 perlのfrom,toの抽出部分は以下のような感じです。 --------------------------------------------- open(OUT1,"> to.tmp"); open(OUT2,"> from.tmp"); open(IN,"< /var/log/syslog"); foreach $buffer (<IN>) { ($tmp) = split(/,/,$buffer); if ($tmp =~ /.*to=</) { print OUT1 "$tmp\n"; } if ($tmp =~ /.*from=</) { print OUT2 "$tmp\n"; } } --------------------------------------------- perlの集計部分は以下のような感じです。(to部分) --------------------------------------------- open(IN,"< to.tmp"); open(OUT,"> syukei_to.txt"); foreach (<IN>) { foreach $address (@address) { $count{$address}+= /$address/g; } } print OUT "naibu-1 = $count{$naibu-1}\n"; print OUT "naibu-2 = $count{$naibu-2}\n"; --------------------------------------------- @addressには参照するドメインの一覧($naibu-1="@hoge.com"とか)を入れておきます。 思いつきでつくったので、問題もあるでしょうし、もっとスマートな方法もあるかとは思います。 自分のこの貧弱スクリプトを見て専門家の方がコメントしてくれたらいいのですが...。
その他の回答 (2)
>過ぎ去った日のぶんがあるので、ログの内容もわかればいいのですが…。 > 実は自分所もsyslogから集計しているんです。 mailstats使えばいいのですが、fromとtoの宛先等を集計しているのでシェルが必要なのです。 シェルの内容は貧弱なので参考になりませんが...^ ^;; >第5(sendmail[12119]:)、第6フィールド(DAA12119) の意味の違いは何でしょうか? > [12119] これはPIDです。 DAA12119 これはキューファイルのIDです。 PIDはsendmailが子プロセスを生成するため、一通のメールでも変化します。 キューファイルは親プロセスのPIDを元に生成されるので、1通で一つのキューファイルのIDとなるはずです。 ちょっと自信なしですが、キューファイルのIDでまとめるといいのではないでしょうか。
補足
ありがとうございます。 実は私もfrom/toから、社内間、社内->社外、社外->社内ごとに集計したくてsyslogを見ていました。が、「キューファイルのID」ごとにfrom/toを抽出しましたが、そこから先good ideaが出てきませんでした(^^); kanop_98さんは、そのような集計をやられていますか?
sendmail V8.7以降として話をします。 ログの見方はとりあえずおいておいて、sendmailには統計情報を生成する機能を持ってます。 プログラムは"mailstats"です。 統計をとるには、 1.sendmail.cfにて「O StatusFile=<統計ファイルのpath>」 通常は/etc/sendmail.stなどとします CFを使っているなら「STAT_FILE_PATH=」で指定します。 2.touch /etc/sendmail.st であらかじめ統計ファイルを作成 3.sendmail再起動 これで統計がとれます。 内容はmailstatsで確認できます。 日ごとや週ごとに集計が必要であれば、この統計ファイル(/etc/sendmail.st)の内容を 定期的にクリアするようにcronを使えばいいでしょう。
お礼
ありがとうございます。CFのデフォルト設定になっていたので、これまでの統計が見れました。cronを仕掛けて、今日からmailstatsコマンドの結果が利用できそうです。 あとは…、過ぎ去った日のぶんがあるので、ログの内容もわかればいいのですが…。
お礼
ご丁寧にありがとうございました。Perlをつかった ことがなくて(^^); ちょっと調べていたためお礼のupが遅くなりました。 メアドのドメインより、社内外ごとのカウントが要求 されているのですが、Perlのスクリプトは参考になる ことがありました。ありがとうございました。