У меня есть несколько хостов, обслуживаемых 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, направляет ваш вывод в нужное место, тогда было бы поучительно взглянуть на код, который это реализует.