Журнал доступу "Catch-All" з віртуальними хостами Apache?


16

У мене є багато віртуальних хостів, налаштованих на веб-сервері, кожен з яких має свій власний журнал помилок та журналу доступу. Відповідні рядки httpd.confприблизно такі:

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

Наразі я отримую деякі випадкові помилки в /var/log/httpd-error.log, але в /var/log/h/httpd-access.log я нічого не отримую. Чи можливо ВСІ доступи та помилки дублювати спільний файл файлів? Чи можливо це зробити без додавання нових записів до кожної VirtualHost?

Відповіді:


17

Див. Http://httpd.apache.org/docs/2.2/logs.html#virtualhost

Якщо директиви CustomLog або ErrorLog розміщені всередині розділу, всі запити або помилки цього віртуального хоста будуть реєструватися лише у вказаний файл. Будь-який віртуальний хост, який не має директив реєстрації, все ще надсилатиме свої запити до основних журналів сервера.

Іншими словами, якщо розмістити директиви журналу в розділі VirtualHost, це змінить директиви журналу в основній конфігурації сервера. Якщо ви хочете увійти в один файл журналу, видаліть конфігурацію журналу зі своїх розділів VirtualHost.

Для простоти я вважаю за краще реєструвати всі дані доступу до одного журналу. Пізніше ви можете обробити журнали та розділити журнали на журнали для віртуальних хостів. Крім того, запис у єдиний файл файлів - це більш ефективне використання ресурсів комп'ютера, а потім запис у 30 логів одночасно. Просто переконайтеся, що ваш LogFormat містить '% v', який записуватиме ім'я Віртуального хоста.

Чи можливо ВСІ доступи та помилки дублювати спільний файл файлів?

Ви можете записати всі помилки та отримати доступ до спільного журналу, але файл некрасивий. Спочатку надішліть дані журналу Apache в syslog, а потім використовуйте syslog для надсилання у локальний файл або на віддалений сервер журналу.

# 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

А потім у /etc/syslog.conf

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

2

Що я зробив, це додати другу рядок CustomLog у розділ VirtualHost. Але мені довелося це робити для кожного окремого файлу vhost conf. Це працює, і це зараз у моєму шаблоні, тому нові машини витягуються.

Тепер мій apache2 записує звернення до двох місць:

  1. Специфікація для vhost в каталозі цього vhost та
  2. до /var/log/apache2в комбінованому файлі для всіх vhosts.

Я, звичайно, застосовую інший LogFormat до кожного з цих двох журналів, щоб вмістити відповідно. /var/log/apache2Лог аналізується з Perl і засмоктує в високо нормализованной структури MySQL для аналізу і звітності. Логротат підмітає раз на тиждень.


1

добре, якщо ви просто хочете бачити журнали в одному місці для всіх віртуальних хостів, ви можете просто ввести:

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

те саме правило стосується кота з грепом:

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

або якщо обертання журналу вже стиснуло файли:

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

приклади тестуються на Debian / Ubuntu


0

Я не думаю, що це можливо. Принаймні в документації не йдеться про таке.

Найкращий спосіб імітувати подібну поведінку - це визначити тег% v у форматі та під час обертання журналу розділити копію файлів журналу на конкретні файли хост-файлу.


0

Я не знаю, чи відповідають ваші розташування файлів журналів за якоюсь схемою у віртуальних хостах, але якщо вони будуть, я б забув про те, щоб Apache створив дублікат журналу і просто переписав журнали, коли мені вони потрібні.

cat /var/www/*/log/access.log > /var/www/logs/access.log

0

Я шукаю відповідь і на це питання. Поки що у мене є два рішення:

  1. кішка рішення joebert згадується
  2. моє власне рішення для хвоста: tail -f /var/log/httpd/*access_log

Я хочу мати можливість tail -fпереглядати всі види діяльності всіх веб-серверів на хості. Я, швидше за все, міг би впасти лише на один файл, оскільки мені не дуже подобається, як хвіст обробляє декілька файлів.


Отримайте багатоповерхівку. Це досить корисно.
до

0

У вас є 2 можливості за допомогою ErrorLog директиви http://httpd.apache.org/docs/2.2/mod/core.html#errorlog

1) Використовуйте syslog і обробляйте дублювання в [r] syslog.conf

2) Використовуйте трубу, надішліть запис журналу до програми / сценарію та обробіть дублювання в цій програмі / скрипті


0

Чи суворо необхідне перегляд усіх журналів доступу? Якщо помилки насправді викликані запитом на vhost, у журналі помилок vhost має бути щось зафіксовано. У такому випадку, ls -t /var/www/*/log/error.log, щоб визначити, хто vhost є винуватцем, а потім перегляд саме цього файлу журналу доступу, здається, буде хорошим першим кроком для усунення безлічі непотрібних читання журналу .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.