Hatena::Groupsubtech

名称未設定♥

 | 

2009-05-28

mod_perl 2で、VirtualHostごとのErrorLogじゃなくてserver contextのErrorLogにエラーログなどが出力されちゃう

17:07 |  mod_perl 2で、VirtualHostごとのErrorLogじゃなくてserver contextのErrorLogにエラーログなどが出力されちゃう - 名称未設定♥ を含むブックマーク はてなブックマーク -  mod_perl 2で、VirtualHostごとのErrorLogじゃなくてserver contextのErrorLogにエラーログなどが出力されちゃう - 名称未設定♥

# zakkuri httpd.conf

LoadModule perl_module modules/mod_perl.so

ErrorLog  "/var/log/httpd/default/default.err"

<VirtualHost *>
  ServerName   curry.example.com

  ErrorLog  "/var/log/httpd/example.com/curry.err"

  PerlOptions  +SetupEnv +Parent
  <Location />
    SetHandler           modperl
    PerlResponseHandler  OrenoHandler
  </Location>
</VirtualHost>

な構成で、OrenoHandler 内で

print        "OrenoTest: STDOUT\n";
print STDERR "OrenoTest: STDERR\n";
warn         "OrenoTest: warn";
my $v1 = "2:" + 3;
eval q[my $v2 = "3:" + 4;];
(undef) . "xxx";
my %h1 = qw(foo bar baz);
die "OrenoTest: die";

とすると、VirtualHostのErrorLogのcurry.errじゃなくて、server contextのErrorLogのdeault.errに全部出ちゃう。

VirtualHostが複数あると、ログが混ざってどのVirtualHostのか判別しづらくなるのでちゃんとVirtualHostのErrorLogに吐かせてあげたい。


http://perl.apache.org/docs/2.0/api/Apache2/Log.html#Virtual_Hosts

に書いてあるように、httpd.confで

-  PerlOptions  +SetupEnv +Parent
+  PerlOptions  +SetupEnv +Parent +GlobalRequest

して、OrenoHandler で

use Apache2::Log ();
$SIG{__WARN__} = \&Apache2::ServerRec::warn;

してあげると、curry.errにはこのように吐かれるようになる。

[warn] OrenoTest: warn at ...
[warn] Argument "3:" isn't numeric in addition (+) at (eval 8) line 1.\n
[warn] Use of uninitialized value in concatenation (.) or string at ...
[warn] Odd number of elements in hash assignment at ...

一方で、default.errにはこのように吐かれる。

Argument "2:" isn't numeric in addition (+) at ...
Useless use of concatenation (.) or string in void context at ...
OrenoTest: STDERR

つまり、

  • warn
  • die
  • eval
  • 実行時エラー?

はVirtualHostのErrorLogに出るようになったけど、

  • STDERR
  • use warningsの警告?

は依然としてserver contextのErrorLogに出てしまう。


まぁこれでだいたいいいかなぁとは思うんですが、2点、残糞感がある感じす。

  1. 残りのSTDERRとwarningsもVirtualHostのErrorLogに出せないか
  2. PerlOptions の GlobalRequest ってなんか副作用ないか心配

しゅ〜しゅ〜

追記 2009-07-10

STDERR と Apache2::ServerRec::warn を tie して、print STDERR を Apache2::ServerRec::warn にしちゃう、というテクを同僚に教えてもらいました。

use Apache2::Log ();
$SIG{__WARN__} = \&Apache2::ServerRec::warn;
{
    package Oreno::_tie_stderr;
    sub TIEHANDLE { bless {}, shift }
    sub PRINT     { shift; Apache2::ServerRec::warn(@_) }
    tie *STDERR, __PACKAGE__;
}

これで print STDERR も VirtualHosts 毎の ErrorLog に出力されるようになったので、残すは

  • use warningsの警告?

のみです。

トラックバック - http://subtech.g.hatena.ne.jp/hirose31/20090528
 |