在 Apache2/mod_perl2 上,stderr 输出不会转到 ErrorLog 指定的日志文件

在 Apache2/mod_perl2 上,stderr 输出不会转到 ErrorLog 指定的日志文件

我喜欢为每个命名的虚拟主机维护单独的 Apache2 日志文件,如下所示:

<VirtualHost *:80>
  ServerName myhost.example.com
  ErrorLog /var/log/apache2/myhost-error.log
</VirtualHost *:80>

指定文件正确收集 Apache2 本身生成的错误消息,例如 404:

[Thu Jul 18 12:07:45 2013] [error] [client 10.0.0.141] File does not exist: /home/mike/myhost/htdocs/favicon.ico

但是,当 myhost 运行发出其自己的日志消息(例如,使用打印到 STDERR)的 mod_perl 脚本时,这些消息仍然会出现在全局 Apache2 错误日志 /var/log/apache2/error.log 中。

这是在 Debian GNU/Linux 6.0 上使用 Apache 2.2.16,但我在 Ubuntu 12.04.2 LTS 和 MacOS 10.5 上也看到同样的情况——我猜这是标准的 Apache2 行为。

我希望我的 mod_perl 脚本的日志记录出现在站点特定的错误日志中,就像 404 和其他 Apache 级错误一样。我该如何实现这一点?

答案1

warn通过覆盖脚本可以部分解决这个问题。STDERR但是仍然会进入主 Apache 错误日志。

Modperl 文档

  1. 首先,我们需要使用 mod_perl 的日志记录功能,而不是 CORE::warn

用 Apache2::ServerRec::warn 替换 warn:

use Apache2::Log ();
Apache2::ServerRec::warn("the code is smoking");

或者将其导入到你的代码中:

use Apache2::ServerRec qw(warn); # override warn locally
warn "the code is smoking";

相关内容