Falha na pipeline de log de erros do Apache

6

Tentando se registrar em um servidor syslog central, use o ErrorLog do Apache para canalizar para o logger ou fazer com que o syslog seja encaminhado, mas nada está funcionando e os erros não fazem sentido para mim. Eu posso obter o log personalizado para trabalhar, mas não ErrorLog. Usando o Apache / 2.4.7 no Ubuntu 14.04 com o rsyslogd 7.4.4.

Config 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, em seguida, recebendo este erro:

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

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

ErrorLog "|syslog:local1"

Mas então temos:

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

Mesmo tentado:

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 tee está escolhendo opções após o segundo canal e o que posso fazer para impedir isso? Eu sou um, mas preso, o Google não é meu amigo, e qualquer outro conselho é apreciado.

    
por SysadminB 15.06.2015 / 16:14

2 respostas

7

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

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

E o outro é implicitamente, usando o prefixo keyword |$ :

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

A causa raiz é uma mudança no Apache 2.4, cf. link :

Em plataformas Unix, os comandos de log canalizado configurados usando o ErrorLog ou o CustomLog foram chamados usando / bin / sh -c no 2.2 e anteriores. Na versão 2.4 e posteriores, os comandos de log canalizados são executados diretamente. Para restaurar o comportamento antigo, consulte a documentação do registro em pipeline.

    
por 15.06.2015 / 19:04
1

Encontrou este post enquanto procurava por uma solução envolvendo eventos de log de depuração de ErrorLog no Apache 2.2.31 que ainda não tem ErrorLogFormat . Aqui está a solução que eu encontrei, e pensei que os outros achassem útil.

Isso separa o referenciador do ErrorLog usando% sem buffersed:

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

Retira a querystring 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 em perl:

ErrorLog "|/usr/local/bin/perl /tmp/fuss.pl >> /var/log/httpd/error_log
    
por 11.06.2016 / 04:16