我在Debian Wheezy服务器上有几个由Apache 2.2.22服务的虚拟主机。 一些虚拟主机是Catalyst应用程序; 所有虚拟主机都使用mod_fastcgi和mod_suexec运行。 每个虚拟主机都configuration为使用不同的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 xxxx] FastCGI: server "/data/vhost/wibble/docs/test.cgi" stderr: Hello! at test.cgi line 9., referer: http://my.test.site/
我怎么能得到催化剂网站写他们的stderr到正确的日志?
唯一相关的问题是我可以find这个 – 类似的问题,但不同的模块( mod_perl ),可悲的是没有答案。 我也发现这个Apache错误报告 ,它描述了与mod_cgid相同的问题。
编辑 :如果我把
open STDERR, ">>../../applogs/app.log" or die "can't open applog: $!";
在Catalyst循环之前,这将stderrredirect到我的日志文件,但显然没有添加date戳或其他前缀。 我想要的是stderr被视为一个裸FCGI脚本相同。
我不确定为什么虚拟主机configuration中的ErrorLog指令不起作用,但发送到STDERR的文本的前缀不是由apache完成的。 而FCGI模块通过安装一个警告处理程序来完成。
请考虑http://search.cpan.org/~skimo/FCGI-0.67/FCGI.PL上的$req->Accept()的文档,
请注意,与旧界面不同,默认情况下不会安装
die和warn处理程序。 这意味着如果你没有运行一个启用了sfioperl,默认情况下,任何warn或die消息都不会在服务器的日志中结束。 build议你自己设置die和warn处理程序。FCGI.pm包含了一个die和warn处理程序的例子。
如果由您的FCGI版本实现的warn处理程序将您的输出引导到正确的位置,那么查看实现该代码的代码可能是有益的。