Dziennik dostępu „Catch-All” z wirtualnymi hostami Apache?

16

Mam wiele wirtualnych hostów skonfigurowanych na serwerze WWW, każdy z własnym dziennikiem błędów i dostępem. Odpowiednie wiersze httpd.confsą mniej więcej takie:

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

Obecnie dostaję jakieś losowe błędy w /var/log/httpd-error.log, ale nic nie dostaję w /var/log/httpd-access.log. Czy możliwe jest duplikowanie WSZYSTKICH dostępów i błędów do udostępnionego pliku dziennika? Czy można to zrobić bez dodawania nowych wpisów do każdego VirtualHost?

pix0r
źródło

Odpowiedzi:

17

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

Jeśli dyrektywy CustomLog lub ErrorLog zostaną umieszczone w sekcji, wszystkie żądania lub błędy dla tego wirtualnego hosta zostaną zarejestrowane tylko w określonym pliku. Każdy wirtualny host, który nie ma dyrektyw dotyczących rejestrowania, będzie nadal wysyłał swoje żądania do dzienników głównego serwera.

Innymi słowy, umieszczenie dyrektyw rejestrowania w sekcji VirtualHost spowoduje zastąpienie dyrektyw rejestrowania w konfiguracji głównego serwera. Jeśli chcesz zalogować się do jednego pliku dziennika, usuń konfigurację dziennika z sekcji VirtualHost.

Dla uproszczenia wolę rejestrować wszystkie dane programu Access w jednym pliku dziennika. Później możesz przetwarzać dzienniki i dzielić pliki dzienników na pliki dzienników dla hostów wirtualnych. Ponadto zapisywanie do jednego pliku dziennika jest bardziej wydajnym wykorzystaniem zasobów komputera niż zapisywanie do 30 plików dziennika jednocześnie. Upewnij się tylko, że Twój LogFormat zawiera „% v”, który zarejestruje nazwę hosta wirtualnego.

Czy możliwe jest duplikowanie WSZYSTKICH dostępów i błędów do udostępnionego pliku dziennika?

Możesz zarejestrować wszystkie błędy i uzyskać dostęp do udostępnionego pliku dziennika, ale plik dziennika jest brzydki. Najpierw wyślij dane dziennika Apache do syslog, a następnie użyj syslog, aby wysłać do lokalnego pliku lub zdalnego serwera dziennika.

# 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

A potem w /etc/syslog.conf

# Send all HTTP log data to this file
local7.*        /var/log/http-all.log
Stefan Lasiewski
źródło
2

To, co zrobiłem, to dodanie drugiej linii CustomLog w sekcji VirtualHost. Ale musiałem to zrobić dla każdego pliku conf vhost. Działa i jest teraz w moim szablonie, więc nowe vhosty są odbierane.

Mój apache2 rejestruje teraz trafienia w dwóch miejscach:

  1. Szczegóły dotyczące hosta vhost w katalogu tego hosta i
  2. do /var/log/apache2w połączonym pliku dla wszystkich vhostów.

Oczywiście stosuję inny LogFormat do każdego z tych dwóch dzienników, aby odpowiednio dostosować. /var/log/apache2Dziennika jest analizowany z Perl i zassane wysoce znormalizowanej konstrukcji MySQL do analizy i raportowania. Logrotate zamiata się raz w tygodniu.

pholt
źródło
1

cóż, jeśli chcesz zobaczyć dzienniki na żywo w jednym miejscu dla wszystkich hostów wirtualnych, możesz po prostu wpisać:

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

ta sama zasada dotyczy kota z grepem:

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

lub jeśli log rotate już skompresował pliki:

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

przykłady są testowane na Debian / Ubuntu

trojański
źródło
0

Nie sądzę, żeby to było możliwe. Przynajmniej dokumentacja nie wspomina o takich rzeczach.

Najlepszym sposobem na symulację tego rodzaju zachowania jest zdefiniowanie znacznika% v w formacie, a przy rotacji dziennika dzielenie kopii plików dziennika na określone pliki hosta wirtualnego.

Kimvais
źródło
0

Nie wiem, czy lokalizacje plików dziennika są zgodne z jakimkolwiek wzorcem na wirtualnych hostach, ale jeśli tak, to zapomnę o tym, aby Apache utworzył duplikat dziennika i po prostu przechwycił dzienniki, gdy ich potrzebuję.

cat /var/www/*/log/access.log > /var/www/logs/access.log
Joebert
źródło
0

Szukam również odpowiedzi na to pytanie. Do tej pory mam dwa rozwiązania:

  1. kot joebert rozwiązanie wymienionych
  2. moje własne rozwiązanie ogona: tail -f /var/log/httpd/*access_log

Chcę być w stanie zobaczyć tail -fcoś w rodzaju całej aktywności serwera WWW na hoście. Wolałbym jednak ogonić tylko jeden plik, ponieważ tak naprawdę nie podoba mi się sposób, w jaki tail obsługuje wiele plików.


źródło
Uzyskaj multitail. To całkiem przydatne.
Do
0

Czy oglądanie wszystkich dzienników dostępu jest absolutnie konieczne? Jeśli błędy są faktycznie spowodowane żądaniem hosta vhost, w dzienniku błędów vhost powinno być zarejestrowane coś. W takim przypadku ls -t /var/www/*/log/error.log, aby ustalić, który vhost jest winowajcą, a następnie obejrzenie tylko tego pliku dziennika dostępu wydaje się być dobrym pierwszym krokiem do wyeliminowania wielu niepotrzebnych odczytów dziennika .

Jeremy M.
źródło