トップ(最新)

nDiki

2004年3月2日 (火)

[ Perl ] Log::Log4perlのはまりどころ このエントリーを含むはてなブックマーク

WiKicker / DiKickerLog::Log4perl 対応作業。

  • www.naney.orgApacheVirtualHost としてエラーログも個別に吐かれている
  • エラーログは自分のホームディレクトリに吐かれるものの、root 所有である
  • ディレクトリは自分に所有権があり、エラーログが肥大化したら消す事もできるのだが、Apache をリスタートする権利がないので(週に1度のシステム側のローテーションが起きるまで)二度とエラーログが見れなくなる。

ということで、warn -> Apacheエラーログに流れている警告メッセージも、Log::Log4perl の方に流して、好きに消せるようにしておくことにする。

@ Log::Log4perl->init_once

SpeedyCGI 下で動かす事を想定して初期化は、init_once で行うようにする。 可能な限り早く初期化すべきなので、設定ファイル名/設定文字列はプロパティファイルに記述しておくのではなく、CGI プログラムで最初に生成する Controller オブジェクトの初期化パラメータで指定するように。

@ $SIG{__WARN__} を設定

$SIG{__WARN__}を設定して、warn のメッセージを Log::Log4perl に送る。 最初はほぼ FAQ の例のまま、以下のように記述。

 use Log::Log4perl qw(:easy);
 BEGIN {
   $::SIG{__WARN__} = sub {
     local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
     WARN(@_);
   };
 }

しかし期待していた通りに動かず悩む。原因は前述する init_once との絡み。 use Log::Log4perl qw(:easy) した時点でデフォルトの初期化が行われてしまうため、初期化済みになってしまって init_once での設定処理がスキップされていたのが問題。

 use Log::Log4perl;
 BEGIN {
   $::SIG{__WARN__} = sub {
     local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
     if (Log::Log4perl->initialized) {
       Log::Log4perl->get_logger->warn(@_);
     }
   };
 }

と修正。 get_logger も暗黙的に初期化を行うので、init_once する前に warn されるとやはりデフォルトの初期化がおこってしまう。 それではまずいので initialized が真(=初期化済み)の時のみロギングするようにする。 ただしこれだと init_once する前の warn メッセージが失なわれる(STDERR あたりに print するようにすればいいかもしれない)。

@ CGI::Carpとの絡み

CGI::Carp も $SIG{__WARN__} を上書きするので同時に使えない。 以前に use していたのが残っていてはまる。

@ Log::Log4perl::Appender::Synchronized で core dump ?

NaneyOrgWikinDiki でロギングしはじめたところ、CGI プログラムの処理はきちんと成功しているもののその後(?) speedy_backend が core dump してしまう事があるようだ。 最初は $::SIG{__WARN__} の設定あたりに問題があるのかと思ったが、Log::Log4perl::Appender::Synchronized を使わないようにしたところ core を吐かなくなった。

IPC::ShareableIPC::Semaphoreなんて使っているしやっぱりこれが怪しい。 とりあえず外しておくことにする。

しかし何らかの方法でシンクロしておかないとログファイルが壊れるはずだから、本当はどうにかしなければならないな。 もっと簡単に flock とかで排他制御する Appender とか無いのかな。 自分で書くしかない?

スポンサード リンク


[ 3月2日全て ]

Related term

■よく検索されるキーワード

perl(47) windows(44) 提案書(43) ドラマ(39) cvs(36) debian(31) linux(27) ほぼ日手帳(27) torrent(24) x31(24) 書き方(23) 使い方(23) サンプル(23) ganttproject(20) java(19) wiki(18) thinkpad(17) tc-1(17) 壁紙(15) アジェンダ(15) 作り方(15) ノート(14) 動画(14) usb(14) アジェンダとは(13) google(13) 手帳(12) ヨドバシカメラ(12) subversion(12) apache(12) ウォーターボーイズ2(12) インストール(11) ssh(11) フリー(11) centos(11) 2008(11) 影舞(11) c#(10) 画像(10) 秋葉原(10) svn(10) rcs(10) 日本語(10) リフィル(10) ほぼ日(10) tortoisesvn(10) 修理(10) ボールペン(9) cgi(9) 本名(9) ポーター(9) dvd(9) usbメモリ(9) クラリチン(8) web(8) 2009(8) a6(8) make(8) ヨドバシ(8) ubuntu(8) truecrypt(8) gtd(8) 設定(8) 写真(8) so905ics(7) ガントチャート(7) activeperl(7) 万年筆(7) 無料(7) svn+ssh(7) 冷蔵庫(7) ツール(7) バッグ(7) porter(7) gantt(7) project(6) firefox(6) scons(6) eclipse(6) flash(6)

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 0.284268s / load averages: 0.77, 0.74, 0.70
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)