我想从一个从mod_perl处理程序调用但没有请求对象($ r)的子例程登录到Apache日志文件。
sub handler {
my ($r) = shift;
...
Common::subroutine_that_also_logs();
...
}
package Common;
sub subroutine_that_also_logs {
...
# $r->log->info('cannot do this')
...
}
使用print STDERR
或warn
时,我想使用Apache2 :: Log在日志中获取其他请求信息: -
[Fri May 30 16:12:37 2014] [info] [client 123.123.123.123] cannot do this
而不仅仅是
cannot do this
我想避免处理程序中的全局init,因为这意味着更新几百个处理程序: -
my $globalr;
sub handler {
$globalr = shift;
...
Common::subroutine_that_also_logs();
}
package Common;
sub subroutine_that_also_logs {
...
$globalr->log->info('can try this')
...
}
我已经设置了一个PerlFixupHandler
用于初始化$globalr
,但我想知道是否有更好的方式,或者$r
是否可以通过其他方式直接使用。
答案 0 :(得分:1)
您可以使用Apache2::RequestUtil
。
package Common;
use Apache2::RequestRec;
use Apache2::RequestUtil;
sub subroutine_that_also_logs {
my $r = Apache2::RequestUtil->request;
# some process you want using $r
}
如果此阶段是PerlFixupHandler,则$r
具有完整的请求信息,例如: MIME类型等等。
如果您使用此方法,则必须在PerlOptions +GlobalRequest
Apache httpd配置文件上写httpd.conf
。
有关详细信息,请参阅perldoc Apache2::RequestUtil
。