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 tee
nach 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 ErrorLog
in 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 ErrorLog
Verwendung 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