Назад | Перейти на главную страницу

На 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 запускает сценарии mod_perl, которые генерируют свои собственные сообщения журнала (например, с использованием print to STDERR), эти сообщения по-прежнему появляются в глобальном журнале ошибок Apache2, /var/log/apache2/error.log.

Здесь используется Apache 2.2.16 в Debian GNU / Linux 6.0, но я также вижу то же самое в Ubuntu 12.04.2 LTS и MacOS 10.5 - я думаю, это стандартное поведение Apache2.

Я хочу, чтобы журнал моих сценариев mod_perl отображался в журнале ошибок конкретного сайта, как и ошибки 404 и другие ошибки уровня Apache. Как я могу это сделать?

Частично это решается переопределением warn для ваших скриптов. STDERR по-прежнему идет в основной журнал ошибок Apache.

Из Документы Modperl:

  1. Во-первых, нам нужно использовать функцию логирования mod_perl вместо CORE :: warn

Либо замените warn на Apache2 :: ServerRec :: warn:

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

или импортируйте его в свой код:

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