Catalyst stderr indo para o log errado

2

Eu tenho vários vhosts servidos pelo Apache 2.2.22 em um servidor Debian Wheezy. Alguns vhosts são aplicativos do Catalyst; Todos os vhosts são executados com mod_fastcgi e mod_suexec . Cada host virtual é configurado para usar um ErrorLog diferente.

Quando o código nos aplicativos do Catalyst grava em stderr (por exemplo, warn é chamado), a mensagem é encerrada no log de erros principal do Apache, em vez daquele especificado no bloco <VirtualHost> . Não é prefixado por um timestamp ou qualquer outra informação.

No entanto, se eu chamar esse script fastcgi trivial

#!/usr/bin/perl

use FCGI;

my $request = FCGI::Request();

while($request->Accept() >= 0) {
    print("Content-type: text/html\r\n\r\n");
    warn 'Hello!';
}

o Hello! acaba no lugar certo, prefixado corretamente:

[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/

Como posso obter os sites do Catalyst para gravar seus stderr no log correto?

A única questão relacionada que posso encontrar é desta - - problema semelhante, mas módulo diferente ( mod_perl ), e infelizmente não há respostas. Eu também encontrei este relatório de bug do Apache , que descreve o mesmo problema com mod_cgid .

Editar : se eu colocar

open STDERR, ">>../../applogs/app.log" or die "can't open applog: $!";

antes do loop do Catalyst, isso redireciona o stderr para o meu arquivo de log, mas obviamente nenhum datestamps ou outros prefixos são adicionados. O que eu quero é que stderr seja tratado da mesma forma que um script FCGI simples.

    
por Flup 10.07.2014 / 16:36

1 resposta

1

Não sei por que as diretivas ErrorLog em suas configurações de virtualhost não estão funcionando, mas o prefixo do texto enviado para STDERR não é feito pelo apache. Em vez disso, o módulo FCGI faz isso instalando um manipulador de advertência.

Considere a documentação no link para $req->Accept() , que diz

Note that unlike with the old interface, no die and warn handlers are installed by default. This means that if you are not running an sfio enabled perl, any warn or die message will not end up in the server's log by default. It is advised you set up die and warn handlers yourself. FCGI.pm contains an example of die and warn handlers.

Se o manipulador warn implementado pela sua versão do FCGI estiver direcionando sua saída para o local correto, talvez seja instrutivo examinar o código que implementa isso.

    
por 17.07.2014 / 12:41