我在 Debian Wheezy 服务器上拥有多个由 Apache 2.2.22 提供服务的虚拟主机。一些虚拟主机是 Catalyst 应用程序;所有虚拟主机都使用 和 运行mod_fastcgi
。mod_suexec
每个虚拟主机都配置为使用不同的ErrorLog
。
当 Catalyst 应用程序中的代码写入 stderr(例如warn
被调用)时,消息最终会出现在主 Apache 错误日志中,而不是<VirtualHost>
块中指定的日志中。它没有以时间戳或任何其他信息为前缀。
但是,如果我调用这个简单的fastcgi
脚本
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
while($request->Accept() >= 0) {
print("Content-type: text/html\r\n\r\n");
warn 'Hello!';
}
最终Hello!
确实出现在正确的位置,并且前缀正确:
[Thu Jul 10 14:40:18 2014] [error] [client x.x.x.x] FastCGI: server "/data/vhost/wibble/docs/test.cgi" stderr: Hello! at test.cgi line 9., referer: http://my.test.site/
我怎样才能让 Catalyst 站点将其 stderr 写入正确的日志?
我能找到的唯一相关问题是这个-- 类似问题,但模块不同(mod_perl
),遗憾的是没有答案。我还发现此 Apache 错误报告,它描述了与 相同的问题mod_cgid
。
编辑:如果我把
open STDERR, ">>../../applogs/app.log" or die "can't open applog: $!";
在 Catalyst 循环之前,这会将 stderr 重定向到我的日志文件,但显然没有添加日期戳或其他前缀。我希望 stderr 的处理方式与裸 FCGI 脚本相同。
答案1
我不确定为什么ErrorLog
虚拟主机配置中的指令不起作用,但发送到的文本的前缀STDERR
不是由 apache 完成的。相反,FCGI 模块通过安装警告处理程序来完成此操作。
考虑以下文档http://search.cpan.org/~skimo/FCGI-0.67/FCGI.PL为$req->Accept()
,这意味着
请注意,与旧界面不同,默认情况下不安装
die
和warn
处理程序。这意味着如果您没有运行sfio
启用的 perl,默认情况下任何warn
或die
消息都不会出现在服务器的日志中。建议您自己设置die
和warn
处理程序。FCGI.pm
包含 die 和 warn 处理程序的示例。
如果warn
您的 FCGI 版本实现的处理程序将您的输出定向到正确的位置,那么查看实现该处理程序的代码可能会有所帮助。