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 tee
aparecen 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 ErrorLog
en 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 ErrorLog
uso 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