![在 Apache2/mod_perl2 上,stderr 输出不会转到 ErrorLog 指定的日志文件](https://linux22.com/image/803108/%E5%9C%A8%20Apache2%2Fmod_perl2%20%E4%B8%8A%EF%BC%8Cstderr%20%E8%BE%93%E5%87%BA%E4%B8%8D%E4%BC%9A%E8%BD%AC%E5%88%B0%20ErrorLog%20%E6%8C%87%E5%AE%9A%E7%9A%84%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6.png)
我喜欢为每个命名的虚拟主机维护单独的 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 错误日志。
- 首先,我们需要使用 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";