Catalyst stderr 进入错误日志

Catalyst stderr 进入错误日志

我在 Debian Wheezy 服务器上拥有多个由 Apache 2.2.22 提供服务的虚拟主机。一些虚拟主机是 Catalyst 应用程序;所有虚拟主机都使用 和 运行mod_fastcgimod_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(),这意味着

请注意,与旧界面不同,默认情况下不安装diewarn处理程序。这意味着如果您没有运行sfio启用的 perl,默认情况下任何warndie消息都不会出现在服务器的日志中。建议您自己设置diewarn处理程序。FCGI.pm包含 die 和 warn 处理程序的示例。

如果warn您的 FCGI 版本实现的处理程序将您的输出定向到正确的位置,那么查看实现该处理程序的代码可能会有所帮助。

相关内容