ログの管理
ログを書き出し始めると、
ログローテーション
ログファイルが肥大化してサーバのディスク容量を圧迫することを防いだり、
Linuxディストリビューションのバイナリパッケージ版のApacheであれば、
supervisorでは、
command = /path/to/app.pl
redirect_stderr = true
stdout_logfile = /path/to/app.log
stdout_logfile_maxbytes = 10MB
stdout_logfile_backups = 7
のように設定を追加することで10MBごとにログファイルを切り分けて、
Perlで独自にデーモンプロセスを書いている場合は注意が必要です。筆者はとあるアプリケーションでログがローテーションされないまま数十GBになってしまい、
手動で起動・
my $fh;
open( $fh, '>>', 'app.log');
# シグナルを受け取ったらファイルを開き直す
local $SIG{HUP} = sub {
undef $fh;
open( $fh, '>>', 'app.log');
};
local $Log::Minimal::PRINT = sub {
my ( $time, $type, $message, $trace) = @_;
print $fh "$time [$type] $message at $trace\n";
}
次のシェルスクリプトと組み合わせることで、
#/bin/bash
DATE=`date +"%Y%m%d"`
mv app.log app.log.$DATE
# ファイルを再オープン
kill -HUP $PID
# 古いファイルの削除
sleep 5
find -name app.log.* -mtime +30 | xargs rm -f
このほかにもtokuhirom氏によるFile::Stampedモジュールを使うと、
ログレベルを適切に付け、無駄を減らす
ログの中から重要なログを見つけ出すのは、
加えて、
ログ集計ツールの作成
問題となりそうな警告はなるべく早く見つけ、
まとめと次回予告今回はアプリケーションの開発や運用をスムーズに回していくために必須となるログの話題として、ログに必要な要素とログの管理方法、Perlで簡易的にログを出力するための方法、CPANに登録されているログモジュールの紹介をしました。適切なログを書き出すことでオペレーションエンジニアとアプリケーションエンジニアがスムーズにコミュニケーションが行えるようになり、サービスの改善サイクルのスピードを上げていくことができるでしょう。
次回は特別編として、小飼弾さんによるインタビュー「Perlハッカーに逢ってきた」を予定しています。お楽しみに!
次回は特別編として、