DBIC での SQL 覗き見と Log::Dispatch

今まで $schema->storage->debug(1) として標準出力に出力される SQL 文を監視していたのですが,なぜか早く終わるリクエストでとらえきれなくなってしまいました。

やむなくロガーを導入することにしました。Log::Log4perl は仕様が重そうなので(log4j のときも設定とかめんどくさかったなぁ)パス。Log::Agent とかなかなか魅力的と思ったのですが,Log::Dispatch の設計思想にやや惹かれてこちらを使うことに…あ,Log::Log4perl ってこれをバックエンドにしてたんですか。作者の Dave Rolsky さんは DateTime のメンテナでもあるんですね。ふむふむ。

インストール自体はさっくり終了(というかテストスクリプトが簡潔すぎ)しました。DBIx::Class::Storage::DBI には debugcb というデバッグ用コールバック設定関数があるので

$schema->storage->debug(1);
$schema->storage->debugcb(
  sub {
    my ($op, $info) = @_;
    $log->debug($info);
  }
);

してやれば OK。とおもいきや,tail で観察するとログが truncate されたとかいってますね。ロックされてないからかな?と思い,Log::Dispatch::File::Locked を使うことにしました。と,こんどはロックされてウェブアプリが帰ってこなくなってしまった…

いろいろドキュメントやソースをみたところ,デフォルトで L::D::File は生きているあいだファイルをオープンしっぱなしだったので,

$logger->add(Log::Dispatch::File::Locked->new(
  {
    close_after_write => 1,
    min_level => ...
  },
));

みたく close_after_write を追加してようやくうまくいくようになりました。