У меня есть много виртуальных хостов, настроенных на веб-сервере, каждый из которых имеет свою ошибку и журнал доступа. Соответствующие строки 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 теперь регистрирует попадания в два места:
/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
Я тоже ищу ответ на этот вопрос. Пока у меня есть два решения:
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 является виновником, а затем просмотр только этого файла журнала доступа, казалось бы, был бы хорошим первым шагом для устранения большого количества ненужного чтения журнала .