Falha na tubulação do log de erros do Apache

Falha na tubulação do log de erros do Apache

Tentando fazer logon em um servidor syslog central, seja direto usando o ErrorLog do Apache para canalizar para o logger ou fazendo com que o syslog encaminhe, mas nada está funcionando e os erros não estão fazendo sentido para mim. Consigo fazer o log personalizado funcionar, mas não o ErrorLog. Usando Apache/2.4.7 no Ubuntu 14.04 com rsyslogd 7.4.4.

Configuração no meu vhost (com e sem espaço após as opções do logger não faz diferença):

LogLevel warn
ErrorLog  "|/usr/bin/tee -a /var/log/apache2/error.log | /usr/bin/logger -tapache_err -plocal1.error"
CustomLog "|/usr/bin/logger -p local4.warning -t apache" combined

e então recebendo este erro:

/usr/bin/tee: invalid option -- 't'

Também tentei (com e sem aspas duplas):

ErrorLog "|syslog:local1"

Mas então consegui:

(2)No such file or directory: AH00089: Couldn't start ErrorLog process 'syslog:local1'.
AH00015: Unable to open logs

Até tentei:

ErrorLog "| /usr/bin/tee -a /var/log/apache2/error.log | nc -u -j xxx.xxx.xxx.xxx 514"

Mas então tee ainda está reclamando:

/usr/bin/tee: invalid option -- 'u'

Por que diabos está teeescolhendo opções após o segundo tubo e o que posso fazer para impedir isso? Estou preso, o Google não é meu amigo e qualquer outro conselho será apreciado.

Responder1

O primeiro canal é o código para o Apache bifurcar um novo comando, mas provavelmente não está bifurcando um shell totalmente novo, o que permitiria que você usasse um novo canal, mas sim executando o comando, então tudo é tratado como um argumento de comando, incluindo o novo tubo, etc. Você provavelmente pode contorná-lo envolvendo-o em um shell, usando dois métodos, um deles é explicitamente:

ErrorLog "|/bin/sh -c 'tee ... | logger ...'"

E a outra é implicitamente, usando a palavra-chave prefix |$:

ErrorLog "|$tee ... | logger ..."

A causa raiz é uma mudança no Apache 2.4, cf.http://httpd.apache.org/docs/2.4/upgrading.html:

Em plataformas Unix, os comandos de log canalizados configurados usando ErrorLog ou CustomLog foram invocados usando /bin/sh -c na versão 2.2 e versões anteriores. Na versão 2.4 e posterior, os comandos de registro canalizados são executados diretamente. Para restaurar o comportamento antigo, consulte a documentação de registro em canal.

Responder2

Encontrei esta postagem enquanto procurava uma solução envolvendo a limpeza de eventos de log no ErrorLogApache 2.2.31 que ainda não possui o ErrorLogFormat. Aqui está a solução que encontrei e pensei que outros achariam útil.

Isso remove o referenciador do ErrorLoguso de unbuffered sed:

ErrorLog "|/bin/sed -u \'s/,\ referer: .*//\' >> /var/log/httpd/error_log"

Remove a string de consulta do referenciador usando unbuffered in-line perl:

ErrorLog "|/usr/local/bin/perl -ne \'$|=1;while (<>){$output = $_; $output =~ s/(referer:\ .*)\?/$1/; print $output}\'>>/var/log/httpd/error_log

Chame um script perl:

ErrorLog "|/usr/local/bin/perl /tmp/fuss.pl >> /var/log/httpd/error_log

informação relacionada