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

pix0r
источник

Ответы:

17

См. Http://httpd.apache.org/docs/2.2/logs.html#virtualhost.

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

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

Для простоты я предпочитаю регистрировать все данные Access в одном лог-файле. Позже вы можете обрабатывать журналы и разбивать файлы журналов на файлы журналов для виртуальных хостов. Кроме того, запись в один файл журнала является более эффективным использованием ресурсов компьютера, чем запись в 30 файлов журнала одновременно. Просто убедитесь, что ваш LogFormat содержит «% v», который будет регистрировать имя виртуального хоста.

Можно ли дублировать ВСЕ обращения и ошибки в общий лог-файл?

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

# 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. Это работает, и это в моем шаблоне теперь, так что новые vhosts взяты из машины.

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

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

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

pholt
источник
1

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

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

То же правило относится к кошке с grep:

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

или если журнал вращается, сжатые файлы уже:

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

примеры тестируются на Debian / Ubuntu

троянский
источник
0

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

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

Kimvais
источник
0

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

cat /var/www/*/log/access.log > /var/www/logs/access.log
joebert
источник
0

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

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

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


источник
Получи мультитейл. Это довольно полезно.
до
0

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

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

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

lrosa
источник
0

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

Джереми М
источник