Apache-Fehlerprotokoll-Piping schlägt fehl

Apache-Fehlerprotokoll-Piping schlägt fehl

Ich versuche, mich bei einem zentralen Syslog-Server anzumelden, entweder direkt mit Apaches ErrorLog, um es an den Logger weiterzuleiten, oder indem ich Syslog weiterleite, aber nichts funktioniert und die Fehler ergeben für mich keinen Sinn. Ich kann das benutzerdefinierte Protokoll zum Laufen bringen, aber nicht ErrorLog. Ich verwende Apache/2.4.7 auf Ubuntu 14.04 mit rsyslogd 7.4.4.

Konfiguration in meinem virtuellen Host (mit und ohne Leerzeichen nach den Logger-Optionen, macht keinen Unterschied):

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

und dann bekomme ich diesen Fehler:

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

Ebenfalls versucht (mit und ohne Anführungszeichen):

ErrorLog "|syslog:local1"

Aber dann bekam ich:

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

Sogar versucht:

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

Aber dann beschwert er sich immer noch:

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

Warum um Himmels Willen werden teenach dem zweiten Pipe Optionen ausgewählt und was kann ich tun, um das zu verhindern? Ich stecke fest, Google ist nicht mein Freund und jeder andere Ratschlag ist willkommen.

Antwort1

Die erste Pipe ist Code für Apache, um einen neuen Befehl aufzuspalten, aber vermutlich wird dabei keine komplett neue Shell aufgespalten, was Ihnen die Verwendung einer neuen Pipe ermöglichen würde, sondern stattdessen wird der Befehl ausgeführt, sodass alles als Befehlsargument behandelt wird, einschließlich der neuen Pipe usw. Sie können dies wahrscheinlich umgehen, indem Sie es in eine Shell einbinden. Eine davon ist explizit:

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

Und die andere ist implizit, durch Verwendung des Präfixschlüsselworts |$:

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

Die Grundursache ist eine Änderung in Apache 2.4, vgl.http://httpd.apache.org/docs/2.4/upgrading.html:

Auf Unix-Plattformen wurden Piped-Logging-Befehle, die mit ErrorLog oder CustomLog konfiguriert wurden, in 2.2 und früher mit /bin/sh -c aufgerufen. In 2.4 und höher werden Piped-Logging-Befehle direkt ausgeführt. Informationen zum Wiederherstellen des alten Verhaltens finden Sie in der Piped-Logging-Dokumentation.

Antwort2

Habe diesen Beitrag gefunden, als ich nach einer Lösung zum Bereinigen von Protokollereignissen ErrorLogin Apache 2.2.31 gesucht habe, das noch nicht über verfügt ErrorLogFormat. Hier ist die Lösung, die ich gefunden habe und von der ich dachte, dass andere sie nützlich finden könnten.

Dadurch wird der Referrer aus der ErrorLogVerwendung von ungepuffertem entfernt sed:

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

Entfernt die Abfragezeichenfolge aus dem Referrer mithilfe von Inline Unbuffered perl:

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

Rufen Sie ein Perl-Skript auf:

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

verwandte Informationen