Log akses "Tangkap Semua" dengan Apache Virtual Host?

16

Saya memiliki banyak host virtual yang diatur di server web, masing-masing memiliki kesalahan dan akses log sendiri. Baris yang relevan httpd.confadalah sesuatu seperti ini:

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

Saat ini, saya mendapatkan beberapa kesalahan acak di /var/log/httpd-error.log, tapi saya tidak mendapatkan apa-apa di /var/log/httpd-access.log. Mungkinkah SEMUA akses dan kesalahan digandakan ke file log bersama? Apakah mungkin untuk melakukan ini tanpa menambahkan entri baru ke setiap VirtualHost?

pix0r
sumber

Jawaban:

17

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

Jika arahan CustomLog atau ErrorLog ditempatkan di dalam bagian, semua permintaan atau kesalahan untuk virtual host itu akan dicatat hanya ke file yang ditentukan. Setiap host virtual yang tidak memiliki arahan logging akan tetap memiliki permintaannya dikirim ke log server utama.

Dengan kata lain, jika Anda menempatkan arahan Logging di dalam bagian VirtualHost, itu akan menimpa arahan Logging dalam konfigurasi server utama. Jika Anda ingin masuk ke satu file log, maka hapus konfigurasi log dari bagian VirtualHost Anda.

Untuk mempermudah, saya lebih suka mencatat semua data akses ke satu file log. Kemudian, Anda bisa memproses log dan memecah file log menjadi file log untuk Virtual Host. Juga, menulis ke satu file log adalah penggunaan sumber daya komputer yang lebih efisien daripada menulis ke 30 file file sekaligus. Pastikan LogFormat Anda menyertakan '% v', yang akan mencatat nama Host Virtual.

Mungkinkah SEMUA akses dan kesalahan digandakan ke file log bersama?

Anda dapat mencatat semua kesalahan dan akses ke file log bersama, tetapi file log jelek. Pertama, kirim data log Apache ke syslog, dan kemudian gunakan syslog untuk mengirim ke file lokal atau server log jarak jauh.

# 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

Dan kemudian di /etc/syslog.conf

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

Apa yang saya lakukan adalah menambahkan baris CustomLog kedua di bagian VirtualHost. Tapi saya harus melakukan ini untuk setiap file conf vhost tunggal. Ini berfungsi dan itu ada di templat saya sekarang sehingga vhosts baru diambil dari mobil.

Apache2 saya sekarang mencatat hit ke dua tempat:

  1. Spesifikasi untuk vhost di direktori dan vhost itu
  2. untuk /var/log/apache2dalam file gabungan untuk semua vhosts.

Saya menerapkan LogFormat yang berbeda untuk masing-masing dari dua log ini untuk mengakomodasi masing-masing, tentu saja. The /var/log/apache2log parsing dengan Perl dan tersedot ke dalam struktur MySQL yang sangat normal untuk analisis dan pelaporan. Logrotate menyapu seminggu sekali.

pholt
sumber
1

nah jika Anda hanya ingin melihat log langsung di satu tempat untuk semua host virtual Anda cukup mengetik:

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

aturan yang sama berlaku untuk kucing dengan grep:

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

atau jika rotate log terkompresi file sudah:

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

contoh diuji di Debian / Ubuntu

trojan
sumber
0

Saya rasa ini tidak mungkin. Setidaknya dokumentasinya tidak menyebutkan hal seperti itu.

Cara terbaik untuk mensimulasikan perilaku semacam ini adalah dengan mendefinisikan% v tag dalam format dan pada rotasi log, pisahkan salinan file log ke file spesifik host virtual.

Kimvais
sumber
0

Saya tidak tahu apakah lokasi file log Anda mengikuti pola apa pun di virtualhosts, tetapi jika mereka melakukannya saya akan lupa tentang membuat Apache membuat duplikat log dan hanya cat log ketika saya membutuhkannya.

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

Saya mencari jawaban untuk pertanyaan ini juga. Sejauh ini, saya punya dua solusi:

  1. yang kucing solusi joebert disebutkan
  2. solusi ekor saya sendiri: tail -f /var/log/httpd/*access_log

Saya ingin dapat melihat tail -fsemacam tampilan ke semua aktivitas server web pada host. Saya lebih suka hanya bisa mengekor satu file, karena saya tidak begitu suka cara tail menangani banyak file.


sumber
Dapatkan multitail. Ini sangat berguna.
Hingga
0

Apakah menonton semua log akses sangat diperlukan? Jika kesalahan sebenarnya disebabkan oleh permintaan untuk vhost, harus ada sesuatu yang dicatat dalam log kesalahan vhost. Dalam hal ini, ls -t /var/www/*/log/error.log untuk menentukan vhost mana yang menjadi biang keladinya dan kemudian menonton saja file akses log yang tampaknya menjadi langkah pertama yang baik untuk menghilangkan banyak pembacaan log yang tidak perlu .

Jeremy M
sumber