Falla la tubería del registro de errores de Apache

Falla la tubería del registro de errores de Apache

Intento iniciar sesión en un servidor syslog central, ya sea directamente usando ErrorLog de Apache para canalizar al registrador o haciendo que syslog reenvíe, pero nada funciona y los errores no tienen sentido para mí. Puedo hacer que funcione el registro personalizado, pero no ErrorLog. Usando Apache/2.4.7 en Ubuntu 14.04 con rsyslogd 7.4.4.

Configuración en mi vhost (con y sin espacio después de las opciones del registrador no hay diferencia):

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

y luego aparece este error:

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

También probé (con y sin comillas dobles):

ErrorLog "|syslog:local1"

Pero luego obtuve:

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

Incluso lo intenté:

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

Pero Tee sigue quejándose:

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

¿Por qué diablos teeaparecen opciones después del segundo tubo y qué puedo hacer para detenerlo? Estoy un poco estancado, Google no es mi amigo y se agradece cualquier otro consejo.

Respuesta1

La primera canalización es el código para que Apache bifurque un nuevo comando, pero probablemente no esté bifurcando un shell completamente nuevo, lo que le permitiría usar una nueva canalización, sino ejecutando el comando, por lo que todo se trata como un argumento de comando. incluyendo la nueva tubería, etc. Probablemente puedas evitarlo envolviéndolo en un shell, usando dos métodos, uno es explícitamente:

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

Y el otro es implícito, usando la palabra clave de prefijo |$:

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

La causa principal es un cambio en Apache 2.4, cf.http://httpd.apache.org/docs/2.4/upgrading.html:

En plataformas Unix, los comandos de registro canalizados configurados usando ErrorLog o CustomLog se invocaban usando /bin/sh -c en 2.2 y versiones anteriores. En 2.4 y posteriores, los comandos de registro canalizado se ejecutan directamente. Para restaurar el comportamiento anterior, consulte la documentación de registro canalizado.

Respuesta2

Encontré esta publicación mientras buscaba una solución que implicara eliminar eventos de registro ErrorLogen Apache 2.2.31 que aún no tiene ErrorLogFormat. Esta es la solución que se me ocurrió y pensé que a otros les resultaría útil.

Esto elimina el referente del ErrorLoguso sin búfer sed:

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

Elimina la cadena de consulta del referente usando sin búfer en línea perl:

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

Llame a un script en Perl:

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

información relacionada