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

Catalyst stderr переходит не в тот журнал

У меня есть несколько хостов, обслуживаемых Apache 2.2.22 на сервере Debian Wheezy. Некоторые хосты являются приложениями Catalyst; все vhosts работают с mod_fastcgi и mod_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.

Я не уверен, почему ErrorLog директивы в ваших конфигурациях виртуального хоста не работают, но префикс текста, отправляемого на STDERR не выполняется apache. Скорее, модуль FCGI делает это, устанавливая обработчик предупреждений.

Изучите документацию на http://search.cpan.org/~skimo/FCGI-0.67/FCGI.PL для $req->Accept(), что говорит

Обратите внимание, что в отличие от старого интерфейса, нет die и warn обработчики устанавливаются по умолчанию. Это означает, что если вы не используете sfio включен perl, любой warn или die по умолчанию сообщение не попадает в журнал сервера. Рекомендуется настроить die и warn сами обработчики. FCGI.pm содержит пример обработчиков die и warn.

Если warn обработчик, реализованный вашей версией FCGI, направляет ваш вывод в нужное место, тогда было бы поучительно взглянуть на код, который это реализует.