nDiki : Log::Log4perl

Log::Log4perl

log4j for PerlPerlロギングフレームワーク

レベル

  • DEBUG、INFO、WARN、ERROR、FATAL

複数のプロセスから同じ appender を使う場合

Log::Log4perl::Appender::Synchronized を使う (Log4perl 0.39 より)。

設定ファイルの書き方

2004年3月2日 (火)

[ Perl ] Log::Log4perlのはまりどころ

WiKicker / DiKickerLog::Log4perl 対応作業。

  • www.naney.orgApache の VirtualHost としてエラーログも個別に吐かれている
  • エラーログは自分のホームディレクトリに吐かれるものの、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日全て ]

2004年6月7日 (月)

ハイパー日記システムLog::Log4perl

朝、Naney's Diary をチェックしたらエラーが出てしまっている。 昨日 WiKickerアップデートした事による影響か。

チェックしたところ、ハイパー日記システムではライブラリに HTTP というパッケージがありその中で Request サブルーチンが定義されていた。 これが HTTP::Request モジュールと被っており、今回 WiKicker の更新で間接的に使用されることになった Log::Log4perl の中での new HTTP::Request と衝突する事に。

名前空間大事。

hns の方の HTTP::Request サブルーチンはそのパッケージ内でしか呼ばれていないようなので、HTTP::RequestSub と名前を変更して対処。

[ 6月7日全て ]

2004年6月12日 (土)

[ DiKicker ] Term DB の改良

改良とういか実装。 DiKicker の Term DB (記事のインデックスファイル)はまだ不完全で、記事・単語の削除機能が一部未実装のところがある。 まとまった時間がとれたので、がりがりコードを書く。

Devel::Coverを使って、テストケースで各コードが使われているかを確認。 Perl だとメソッド名の typo など実際に実行されるまで気がつかないバグがあるので、コードを通過しているかどうかだけでもチェックできると結構便利。

WiKicker の部分とあわせて、Log::Log4perl によるロギングも随時整理。

[ 6月12日全て ]

2004年7月20日 (火)

PARActivePerl 5.6.1 build 638 に

昨日 Linux 上で実験してみた PARWindows にも入れてみる。 PDLを使っている関係で ActivePerl は 5.6.1。

インストール

ppm install で入るパッケージは古いので、最新のものを入れておく。 ちょっと手間。

ワンライナーを pp できるところまで動作確認。

モジュール + スクリプトを実行可能形式に

ExtUtils::Makemakerを使ってパッケージ化している開発中のモジュール(スクリプトあり、XS あり)を実行可能形式化してみる。

 perl Makefile.PL
 nmake
 nmake test
 cd blib
 set PERL5LIB=lib;arch (pp の -I オプションが効かなかったので)
 pp -o foo.exe -a lib -a arch -M ... -c  script/foo

Log::Log4perl::Appender::Screen、Jcode::Unicode::NoXS、Unicode::String、GD については依存関係を自動検出できなかったので、それぞれ -M で指定。

できた。動いた。素晴しい。 PDL や GD を使っていたのでちょっと不安だったのだがうまく動いて感激。 これでCD-ROMとか USB メモリに入れておいて一発実行とかできる。

[ 7月20日全て ]

2005年4月10日 (日)

Windows 上での Apache 2.0.53 では PATH_INFOシフト JIS

WiKickerWindows 上での動作確認の続き。 WiKickerPPM パッケージを作成して ActivePerl 5.8.6.811 上にインストール。 依存するモジュールで、ActivePerl に入っていないものは以下の通り。

既に手元で PPM パッケージ化済みなので、これもインストールしておく。

後は RCS をパスの通っているディレクトリに入れてタイムゾーンを設定。

 TZ=JST-9

CGI プログラムとして実行。 お、表示できた。 書き込みはと。

エラー

予想していたけれど、sendmail に依存していたところ。 sendmail が見つからない場合はメールの送信をスキップするように修正。

これでうまく動くかなと思ったら、日本語名のページを作るとうまく表示できない問題を発見。

PATH_INFOシフト JIS で渡される

WiKicker では UTF-8 文字列をURIエスケープして WikiPageURLを生成している。 このURIにアクセスされると WiKicker は、PATH_INFO から WikiName を取り出す。 この文字列がシフト JIS になってしまっている。

Windowsファイル名に使用する charset にあわせて、Apache が変換してしまっているようだ。 調べてみると他の WikiEngine でも同様の問題にあっているという記事が見つかった。

将来の 2.0 系でパッチが取り込まれて修正されるとか、そうでないとか。

現状どうするかなぁ。 WiKicker 側でシフト JIS から UTF-8 に戻すというのもできない事はないけれど、あまりやりたくはないな。 いったんシフト JIS を介しているという時点で、シフト JIS に無い文字の扱いに関する問題をかかえてしまっているし(Apache が)。

対策案:

  • Apache 1.x 系を使う (まだ未確認だが、こちらだと勝手に変換されないらしい)
  • WiKickerPATH_INFO を使わないオプションをつける(URI Query Component は勝手に変換されない)
  • WiKicker 側でシフト JIS から UTF-8 に変換する
[ 4月10日全て ]

2005年5月11日 (水)

WiKicker 0.26 と ActivePerl 5.8.6.811 (Win32)

0.26 での依存モジュールの再確認。 ActivePerl 5.8.6.811では、追加で

  • Algorithm::Diff
  • Jcode
  • Log::Log4perl
  • TimeDate (Time::Zone)
  • MIME::Base32

が必要。 それから RCS。動作確認は Apache で。

ロックまわりがうまく動いているかちょっと不安なのでテストが必要だが、一人でメモ用に使う分には問題なく使えるようになったかな。

[ 5月11日全て ]

2006年2月10日 (金)

WiKickerMakefile.PLModule::Install ベースに

WiKicker には依存している Perl モジュールとして、必須なものとオプションなものがある。 必須なものは例えば Log::Log4perl など。 一方 Cache::MemcachedHTML::Scrubber などは、追加機能を使用したい場合のみ必要である。

一般的な Perl モジュールパッケージと同様、WiKicker では Makefile.PLExtUtils::MakeMaker を使っている。 必須な依存 Perl モジュールは PREREQ_PM に指定してあるが、オプションのものについては独自にチェックして警告をするにとどめていた。 しかしこれだと、オプションのものは CPAN.pm を使って自動的にインストールすることができない。

ということで検討した結果、Module::Install を用いることにした。 Module::Install を用いて Makefile.PL を作成すると、

  • 依存モジュールを、それぞれ必須のもの・ビルドのみ時に必要なもの・推奨のものと分けて処理できる。
  • Makefile.PL 実行時に、未インストールの依存モジュールを CPAN からインストールできる。
  • 依存モジュールを feature 別にまとめて、ビルド時に未インストールのものをインストールするか対話的に選択できる。

などの機能が使えるようになる。

Module::Install の実行に必要なファイルはパッケージの inc ディレクトリ以下に自動的にコピーされ配布パッケージに含められるので、インストールする側はそのために余分なインストールを強いられることもない。

最終的に内部で ExtUtils::MakeMaker を使っているので、それの機能はほぼ全て使える。

Perl のバージョンも 5.004 から使えるとのことで、Perl 5.005_03 以上を対象としている WiKicker で使っても問題なし。

ということで、Makefile.PL をさらっと書き換え。

合わせて WiKicker に含まれていた実験的な機能を削除して、(オプションな)依存モジュールも減らすことにした。

次回のリリース版から、Module::Install ベースだ。

[ 2月10日全て ]

2006年10月3日 (火)

www.naney.org 容量超過警告につきダイエット開始

ホスティングサービス会社より、www.naney.org契約容量超過との警告のメールをもらった。まずい。

ということで急いでデータの整理を開始。

これでもまだまだ。コンテンツ系も、かなり整理する必要がありそうだ。 できれば他からリンクされているコンテンツについては対応する新しいものへリダイレクト設定しておきたいのだが、作業時間的にはちょっと無理。

[ 10月3日全て ]

2011年10月15日 (土)

YAPC::Asia Tokyo 2011 2日目

@kazuho → @kazeburo → @nekokak → @hiratara → @comewalk → @aloelight → @sartak → @Yappo → LT → @hidek → @lestrrat

雨大丈夫かなーと思って家を出たら、いきなりザーザーで折り畳み傘をさしたものの、ちょっと濡れたかなって感じで、着替え調達を口実に昨日ちょっと欲しいなと思った Perl T シャツを買ったんだけれど、そのあとは雨はあがりましたとか。

トーク

続 Unix Programming with Perl Kazuho Oku

IPC::Open3 の話とか。

運用しやすいWebアプリケーションの構築方法 masahiro nagano

過去 Log::Log4perl とかをチョイスしていたけど、より Log::Minimal の方が手軽そうでいいな。

watch your log nekokak

DevOps なお話。

開発と運用のコミュニケーション大切。開発だけれど障害出ると「ヤバい俺か?」といつもビビる。

Monads in Perl Masahiro Honma

モナド。

今までスルーしてたので参考になった。「Perl でモナドってみた」については理解するのに良いけど、(Perl において)プラクティカルかというと微妙だなという第一印象。まだ掘り下げて学ぶ必要あり。

Evolution of API With Blogging Takatsugu Shigeta

Blog をとりまく今までの歴史など。

少人数でのWebアプリ開発 - CGIからPSGIまでの変遷 aloelight

私的開発スタイルの変遷について。

DTrace: printf debugging for seventh-level wizards sartak

DTrace で何かごにょごにょやってた。

Perl Hackers Hub の舞台裏 Kazuhiro Osawa

スピーカーが一方的に話すだけではない YAPC らしいセッションを試みるなど、チャレンジングな良いトーク。

LT

いろいろ。

Managing A Band Of Hackers Hideo Kimura

マネージメント視点での話。他に無いトークで良かった。 DeNA にもってかれた。

Closing Daisuke Maki

時間もおしてたので、マキで。

トークとしては、やはり聞いてる自分が「お、これは自分でもやってみたいな」とか「ここに生かせるな」と思えるものが印象に残るし満足感が高いね。ここは落とし穴だから注意ねとか、ハマッたのでこんな工夫してみたよとかも引きこまれる。

逆に Perl 的な話だったとしてもモジュールの羅列紹介とかだとちょっと退屈。

内容レベル的には、浅すぎず、後半だんだん高度な話になってきたところでギリギリついていけるぐらいがいいかなと。

以上はもし自分がトークする立場になった時の参考用のメモ。

YAPC::Asia Tokyo 2012 もぜひ開催を!

今日のさえずり: 去年の YAPC は人生に転機をもたらしてくれた。今年は何につなげようか。

[ 10月15日全て ]

2021年12月10日 (金)

今日のさえずり: Log::Log4perl は大丈夫か?

[ 12月10日全て ]

About

Naney Naneymx

Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。

※本サイトの内容は個人的見解であり所属組織とは関係ありません。

Process Time: 0.054579s / load averages: 0.68, 0.75, 0.74