Назад | Перейти на главную страницу

Журнал доступа «Catch-All» с виртуальными хостами Apache?

У меня есть много виртуальных хостов, настроенных на веб-сервере, каждый из которых имеет свою ошибку и журнал доступа. Соответствующие строки 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/httpd-access.log. Можно ли дублировать ВСЕ доступы и ошибки в общий файл журнала? Можно ли сделать это без добавления новых записей на каждый VirtualHost?

Видеть http://httpd.apache.org/docs/2.2/logs.html#virtualhost

Если директивы CustomLog или ErrorLog размещены внутри раздела, все запросы или ошибки для этого виртуального хоста будут регистрироваться только в указанном файле. Любой виртуальный хост, у которого нет директив журналирования, по-прежнему будет получать запросы, отправленные в журналы основного сервера.

Другими словами, если вы разместите директивы ведения журнала в разделе VirtualHost, он переопределит директивы ведения журнала в основной конфигурации сервера. Если вы хотите войти в один файл журнала, удалите конфигурацию журнала из разделов VirtualHost.

Для простоты я предпочитаю регистрировать все данные Access в одном файле журнала. Позже вы можете обработать журналы и разбить их на файлы журналов для виртуальных хостов. Кроме того, запись в один файл журнала - более эффективное использование ресурсов компьютера, чем запись в 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

Я добавил вторую строку CustomLog в раздел VirtualHost. Но мне приходилось делать это для каждого файла конфигурации vhost. Это работает, и теперь это в моем шаблоне, поэтому новые хосты берутся на машину.

Мой apache2 теперь регистрирует попадания в два места:

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

Я применяю разные форматы LogFormat к каждому из этих двух журналов, конечно, чтобы учесть их соответственно. В /var/log/apache2 log анализируется с помощью Perl и засасывается в строго нормализованную структуру MySQL для анализа и составления отчетов. Logrotate подметает раз в неделю.

ну, если вы просто хотите видеть живые журналы в одном месте для всех виртуальных хостов, вы можете просто ввести:

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

то же правило применяется для cat с grep:

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

или если поворот журнала уже сжал файлы:

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

примеры протестированы на Debian / Ubuntu

Я не думаю, что это возможно. По крайней мере документация не упоминает об этом.

Лучший способ смоделировать такое поведение - определить тег% v в формате и при ротации журнала разделить копию файлов журнала на файлы, специфичные для виртуального хоста.

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

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

Я тоже ищу ответ на этот вопрос. Пока у меня есть два решения:

  1. то кошка решение, упомянутое Джобертом
  2. мое собственное хвостовое решение: tail -f /var/log/httpd/*access_log

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

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

1) Используйте syslog и обработайте дублирование в [r] syslog.conf

2) Используйте канал, отправьте запись журнала в приложение / сценарий и обработайте дублирование в этом приложении / сценарии

Строго необходимо следить за всеми журналами доступа? Если ошибки на самом деле вызваны запросом на виртуальный хост, должно быть что-то зарегистрировано в журнале ошибок виртуального хоста. В этом случае ls -t /var/www/*/log/error.log, чтобы определить, какой vhost является виновником, а затем просмотр только этого файла журнала доступа, казалось бы, был бы хорошим первым шагом для устранения большого количества ненужного чтения журнала .