"Catch-All" -Zugriffsprotokoll mit virtuellen Apache-Hosts?

16

Ich habe viele virtuelle Hosts auf einem Webserver eingerichtet, von denen jeder über ein eigenes Fehler- und Zugriffsprotokoll verfügt. Die relevanten Zeilen von httpd.confsind etwa so:

ErrorLog /var/log/httpd-error.log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/httpd-access.log combined

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName myhost.com
    ServerAlias www.myhost.com
    DocumentRoot /var/www/myhost.com/htdocs
    ErrorLog /var/www/myhost.com/log/error.log
    CustomLog /var/www/myhost.com/log/access.log combined
</VirtualHost>

# ... many more VirtualHosts

Derzeit werden in /var/log/httpd-error.log einige zufällige Fehler angezeigt, in /var/log/httpd-access.log jedoch keine. Ist es möglich, ALLE Zugriffe und Fehler in eine gemeinsame Protokolldatei zu kopieren? Ist es möglich, dies zu tun, ohne jedem einzelnen VirtualHost neue Einträge hinzuzufügen?

pix0r
quelle

Antworten:

17

Siehe http://httpd.apache.org/docs/2.2/logs.html#virtualhost

Wenn CustomLog- oder ErrorLog-Anweisungen in einem Abschnitt platziert werden, werden alle Anforderungen oder Fehler für diesen virtuellen Host nur in der angegebenen Datei protokolliert. Für jeden virtuellen Host ohne Protokollierungsanweisungen werden die Anforderungen weiterhin an die Protokolle des Hauptservers gesendet.

Mit anderen Worten, wenn Sie Protokollierungsanweisungen in einen VirtualHost-Abschnitt einfügen, werden die Protokollierungsanweisungen in der Hauptserverkonfiguration überschrieben. Wenn Sie sich in einer einzelnen Protokolldatei anmelden möchten, entfernen Sie die Protokollkonfiguration aus Ihren VirtualHost-Abschnitten.

Der Einfachheit halber ziehe ich es vor, alle Access-Daten in einer einzigen Protokolldatei zu protokollieren. Später können Sie die Protokolle verarbeiten und die Protokolldateien in Protokolldateien für die virtuellen Hosts aufteilen. Das Schreiben in eine einzelne Protokolldatei ist außerdem eine effizientere Verwendung der Computerressourcen als das gleichzeitige Schreiben in 30 Protokolldateien. Stellen Sie einfach sicher, dass Ihr LogFormat '% v' enthält, das den Namen des virtuellen Hosts protokolliert.

Ist es möglich, ALLE Zugriffe und Fehler in eine gemeinsame Protokolldatei zu kopieren?

Sie können alle Fehler und den Zugriff auf eine freigegebene Protokolldatei protokollieren, die Protokolldatei ist jedoch unschön. Senden Sie zuerst die Apache-Protokolldaten an syslog und anschließend mithilfe von syslog an eine lokale Datei oder einen Remote-Protokollserver.

# Send access logs to syslog
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/bin/logger -t httpd -i -p local7.notice" combined
# Send error logs to syslog
ErrorLog syslog:local7

Und dann in /etc/syslog.conf

# Send all HTTP log data to this file
local7.*        /var/log/http-all.log
Stefan Lasiewski
quelle
2

Was ich getan habe, war das Hinzufügen einer zweiten CustomLog-Zeile im VirtualHost-Abschnitt. Aber ich musste das für jede einzelne vhost conf-Datei tun. Es funktioniert und es ist jetzt in meiner Vorlage, so dass neue Geister aufgenommen werden.

Mein Apache2 protokolliert jetzt Treffer an zwei Stellen:

  1. Die Einzelheiten für einen vhost im Verzeichnis dieses vhost und
  2. um /var/log/apache2in einer kombinierten Datei für alle vhosts.

Natürlich wende ich auf jedes dieser beiden Protokolle ein anderes LogFormat an, um dies jeweils zu berücksichtigen. Das /var/log/apache2Protokoll wird mit Perl analysiert und zur Analyse und Berichterstellung in eine stark normalisierte MySQL-Struktur eingelesen. Logrotate fegt einmal pro Woche.

Schlag
quelle
1

Nun, wenn Sie nur Live-Protokolle für alle virtuellen Hosts an einem Ort anzeigen möchten, können Sie Folgendes eingeben:

tail -f /var/www/*/access.log

Die gleiche Regel gilt für Katze mit Grep:

 cat /var/www/*/access.log | grep "something"

oder wenn log drehen die dateien schon komprimiert:

gzip -d /var/www/*/access.log.2.gz

Beispiele werden unter Debian / Ubuntu getestet

Trojaner
quelle
0

Ich denke nicht, dass das möglich ist. Zumindest in der Dokumentation wird so etwas nicht erwähnt.

Am besten simulieren Sie dieses Verhalten, indem Sie das% v-Tag im Format definieren und bei der Protokollrotation eine Kopie der Protokolldateien auf bestimmte virtuelle Hostdateien aufteilen.

Kimvais
quelle
0

Ich weiß nicht, ob die Speicherorte Ihrer Protokolldateien auf den virtuellen Hosts einem bestimmten Muster entsprechen. Andernfalls würde ich jedoch vergessen, dass Apache ein doppeltes Protokoll erstellt und die Protokolle nur nach Bedarf sortiert.

cat /var/www/*/log/access.log > /var/www/logs/access.log
joebert
quelle
0

Ich suche auch nach einer Antwort auf diese Frage. Bisher habe ich zwei Lösungen:

  1. die Katze Lösung joebert erwähnt
  2. meine eigene Schwanzlösung: tail -f /var/log/httpd/*access_log

Ich möchte eine tail -fArt Sicht auf alle Webserver-Aktivitäten auf dem Host haben. Ich wäre jedoch viel lieber in der Lage, nur eine Datei zu tailen, da mir die Art und Weise, wie Tail mit mehreren Dateien umgeht, nicht wirklich gefällt.


quelle
Holen Sie sich Multitail. Das ist ziemlich nützlich.
Bis zum
0

Sie haben zwei Möglichkeiten, die ErrorLog-Direktive http://httpd.apache.org/docs/2.2/mod/core.html#errorlog zu verwenden

1) Verwenden Sie syslog und führen Sie die Duplizierung in [r] syslog.conf durch

2) Verwenden Sie Pipe, senden Sie den Protokolleintrag an eine Anwendung / ein Skript und behandeln Sie die Duplizierung in dieser Anwendung / diesem Skript

lrosa
quelle
0

Ist es unbedingt erforderlich, alle Zugriffsprotokolle zu überwachen? Wenn die Fehler tatsächlich durch eine Anforderung für einen vhost verursacht werden, sollte im vhost-Fehlerprotokoll etwas protokolliert sein. In diesem Fall ist es ein guter erster Schritt, mit ls -t /var/www/*/log/error.log zu ermitteln, welcher vhost der Schuldige ist, und dann nur diese Zugriffsprotokolldatei zu überwachen, um unnötiges Lesen von Protokollen zu vermeiden .

Jeremy M
quelle