Настройка логов в Apache
Одним из кусков пазла веб-сайта являются его веб-логи. Для большинства сайтов анализ трафика является одной из главных задач, а результат такого анализа зависит от того, как вы настроили свои логи.
Apache - это одно из самых (если не самое) мощных open-source решений для создания веб-серверов. Как вы позже увидите, возможности ведения логов в Apache как для одного сайта, так и для нескольких доменов очень гибки.
Примечание автора: Большинство возможностей настройки логов применимы для любой операционной системы, но некоторые из них специфичны только для Unix/Linux.
Apache по умолчанию довольно хорошо сконфигурирован для ведения логов одного сайта. Стандартный файл httpd.conf (находится в /etc/httpd/conf/httpd.conf) должен иметь раздел логов с подробными комментариями для каждой директивы. Каталог логов по умолчанию находится в /etc/httpd/logs. Позже мы покажем как изменить этот путь. Теперь давайте рассмотрим раздел настройки логов:
ErrorLog logs/error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log combined
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log combined
Лог ошибок (Error Log)
Лог ошибок содержит сообщения, поступающие от Apache (ошибки, уведомления и т.п.). Этот лог очень полезен для поиска и устранения проблем, возникающих на стороне сервера.
Совет: Если вы тестируете ваш сервер, то можете использовать командную строку для интерактивного просмотра логов. Введите “tail –f /path/to/error_log”. Эта команда выведет несколько последних строк лога, а также продолжит показывать новые сообщения по мере их поступления.
Тут возможностей для настройки не так много - кроме возможности указать, где находится файл лога, и какой уровень ошибок вы хотите отслеживать в логе, больше опций нет. Теперь давайте посмотрим на настройку лога в httpd.conf:
ErrorLog logs/error_log
Если вы хотите сохранять всю информацию об ошибках в один лог, то этой директивы хватит (даже для множества доменов). Однако вы можете специфицировать файл лога ошибок для каждого домена. Это делается в секциях <VirtualHost> примерно следующим образом:
<VirtualHost 10.0.0.2>
DocumentRoot "/home/sites/domain1/html/"
ServerName domain1.com
ErrorLog /home/sites/domain1/logs/error.log
</VirtualHost>
DocumentRoot "/home/sites/domain1/html/"
ServerName domain1.com
ErrorLog /home/sites/domain1/logs/error.log
</VirtualHost>
Если вы системный администратор и ответственны за контроль логов, то рекомендую вам использовать один файл. А если вы предоставляете хостинг для клиентов, то удобней задать отдельный лог ошибок для каждого клиента, чтобы каждый из них мог отслеживать свои ошибки.
Уровень ошибок, попадающих в лог, устанавливается следующим образом:
LogLevel warn
В Apache определены следующие уровни ошибок:
Уровень | Описание |
---|---|
emerg | Экстренный – система не функционирует |
alert | Ошибку необходимо немедленно исправить |
crit | Критическая ошибка |
error | Ошибка |
warn | Предупреждение |
notice | Уведомление (нормальное функционирование) |
info | Информационное сообщение |
debug | Сообщение отладки |
Контроль активности сайта
В основном по умолчанию Apache генерирует три лога активности: лог доступа, агентов и лог ссылающихся страниц (рефереров). Они отслеживают доступ к сайту, браузеры, используемые для доступа, и ссылающиеся URL, с которых приходят ваши посетители.
Довольно просто использовать комбинированный формат сообщения лога Apache (combined), который объединяет эти три лога в один лог-файл. Такой подход очень удобен, когда используется программа анализа трафика, так как большинство из этих программ легко функционируют, когда есть только один лог-файл на домен.
Теперь давайте разберем код комбинированного формата сообщения лога:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Строка начинается с LogFormat и сообщает Apache, что вы определили тип файла лога, в данном случае - комбинированный. Сейчас давайте взглянем на символы, которые составляют определение формата сообщения.
%h | IP адрес клиента (удаленного хоста). |
%l | Имя пользователя (от identd). |
%u | userid удаленного пользователя (полезно при HTTP авторизации). |
%t | Дата и время запроса. |
%r | Строка запроса. |
%s | Код статуса, отсылаемый сервером клиенту (201, 301, 404, 500, и т.д.). Символ > перед s показывает, что в лог записывается только последний статус. |
%b | Количество отправленных байтов клиенту (HTTP заголовки не учитываются). |
%i | Элементы, передаваемые в HTTP заголовках. Таким образом, добавляя Referer и User-Agent можно отслеживать ссылающиеся URL и типы браузеров. |
Прим. переводчика: Если запрошенная информация недоступна, то в логе она заменяется дефисом. Чтобы вставить в лог символ % необходимо использовать %%.
Совет: Вы можете использовать больше HTTP заголовков. Полный список заголовков можно найти на www.w3.org.
Для одного сайта достаточно записи по умолчанию:
CustomLog logs/access_log combined
А для множества сайтов есть несколько вариантов. Наиболее простой - это определить отдельный лог-файл для каждого домена. Для этого, как видно из примера ниже, необходимо использовать директивы лога внутри секции <VirtualHost> каждого домена.
<VirtualHost 10.0.0.2>
DocumentRoot "/home/sites/domain1/html/"
ServerName domain1.com
ErrorLog /home/sites/domain1/logs/error.log
CustomLog /home/sites/domain1/logs/web.log
</VirtualHost>
<VirtualHost 10.0.0.3>
DocumentRoot "/home/sites/domain2/html/"
ServerName domain2.com
ErrorLog /home/sites/domain2/logs/error.log
CustomLog /home/sites/domain2/logs/web.log
</VirtualHost>
<VirtualHost 10.0.0.4>
DocumentRoot "/home/sites/domain3/html/"
ServerName domain3.com
ErrorLog /home/sites/domain3/logs/error.log
CustomLog /home/sites/domain3/logs/web.log
</VirtualHost>
DocumentRoot "/home/sites/domain1/html/"
ServerName domain1.com
ErrorLog /home/sites/domain1/logs/error.log
CustomLog /home/sites/domain1/logs/web.log
</VirtualHost>
<VirtualHost 10.0.0.3>
DocumentRoot "/home/sites/domain2/html/"
ServerName domain2.com
ErrorLog /home/sites/domain2/logs/error.log
CustomLog /home/sites/domain2/logs/web.log
</VirtualHost>
<VirtualHost 10.0.0.4>
DocumentRoot "/home/sites/domain3/html/"
ServerName domain3.com
ErrorLog /home/sites/domain3/logs/error.log
CustomLog /home/sites/domain3/logs/web.log
</VirtualHost>
Подробнее об организации виртуальных хостов можно прочитать в книге "Apache для профессионалов" (описание глав книги), которую можно заказать в Озоне.
В этом примере у нас есть три домена с тремя уникальными веб-логами (использующие комбинированный формат, рассмотренный выше).
Этот метод хорошо работает для большинства хостов. Однако могут быть ситуации, где такой подход может быть трудновыполнимым. В таких случаях Apache рекомендует использовать специальный лог-файл для одного большего виртуального хоста, а для генерации лог-файлов отдельных доменов использовать специальные инструменты.
Для этого надо использовать тип формата лог-файла - сvh (common virtual host). Просто добавляя %v (виртуальный хост) в начало комбинированного формата лога, определенного ранее, мы можем собрать сообщения всех доменов в один лог-файл, а затем автоматически разбить его на отдельные лог-файлы.
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" cvh
В этом случае мы не используем директиву CustomLog в секциях <VirtualHost>, а просто получаем один лог-файл, сгенерированный Apache. Программа, разбивающая этот файл, называется split_logfile и находится в каталоге src/support в исходниках Apache. Если у вас нет исходников Apache, то для этих целей можно скачать скрипт на Perl.
Отдельные лог-файлы создаются из главного файла с именами виртуальных хостов и выглядят так: virtualhost.log.
Ротация логов
В завершении мы хотим рассмотреть механизм ротации логов. Сайты с большим трафиком генерируют большие лог-файлы, которые быстро заполняют свободное место на дисках серверов. Для управления этим процессом можно использовать ротацию логов.
Есть много возможностей осуществления ротации логов и множество сторонних инструментов для этого. А так как мы рассматриваем стандартную конфигурацию Apache, будем использовать простую схему ротации логов. Ниже я дам ссылки на более гибкие методы ротации логов.
Этот метод использует простой shell-скрипт для перемещения текущего веб-лога в архивный лог, сжатия архивного лога и хранения архивов за 12 месяцев. После этого производится перезапуск Apache с паузой для переключения лог-файлов.
mv web11.tgz web12.tgz
mv web10.tgz web11.tgz
mv web9.tgz web10.tgz
mv web8.tgz web9.tgz
mv web7.tgz web8.tgz
mv web6.tgz web7.tgz
mv web5.tgz web6.tgz
mv web4.tgz web5.tgz
mv web3.tgz web4.tgz
mv web2.tgz web3.tgz
mv web1.tgz web2.tgz
mv web.tgz web1.tgz
mv web.log web.old
/usr/sbin/apachectl graceful
sleep 300
tar cvfz web.tgz web.old
mv web10.tgz web11.tgz
mv web9.tgz web10.tgz
mv web8.tgz web9.tgz
mv web7.tgz web8.tgz
mv web6.tgz web7.tgz
mv web5.tgz web6.tgz
mv web4.tgz web5.tgz
mv web3.tgz web4.tgz
mv web2.tgz web3.tgz
mv web1.tgz web2.tgz
mv web.tgz web1.tgz
mv web.log web.old
/usr/sbin/apachectl graceful
sleep 300
tar cvfz web.tgz web.old
Этот код может быть скопирован в файл logrotate.sh, и помещен в каталог, где хранится файл web.log (файл лога). Только измените имена лог-файлов на ваши, а также поменяйте права на 755, чтобы файл смог исполняться.
Такой подход хорошо работает для одного загруженного сайта. Если у вас более сложные требования для ротации логов, посмотрите следующие ссылки.
Например, /etc/newsyslog.conf.
Комментарий от Universite — Май 12, 2006 @ 11:41 am
Комментарий от Администратор — Май 12, 2006 @ 11:47 am
/var/log/apache/httpd-access.log www:wheel 640 45 * @T00 JN
/var/log/apache/httpd-error.log www:wheel 640 45 * @T00 JN
/var/log/apache/httpd-suexec.log www:wheel 640 45 * @T00 J /var/run/httpd.pid 30
Комментарий от Freedom — Май 15, 2006 @ 4:19 pm
Комментарий от kev — Май 15, 2006 @ 5:08 pm
Комментарий от Егор — Апрель 11, 2008 @ 10:06 pm
_____________________
http://www.lunarhost.ru/
Комментарий от андрюха — Август 29, 2008 @ 4:04 pm
Комментарий от Televizor — Ноябрь 1, 2008 @ 2:09 pm
Скорей всего нет.
По крайней мере я не нашёл ссылки и информации по данному вопросу.
Автору спасибо за статью
Комментарий от Oleg — Ноябрь 25, 2008 @ 12:00 pm
Комментарий от forexster — Ноябрь 25, 2008 @ 7:27 pm
Комментарий от Игорь — Ноябрь 27, 2008 @ 7:07 am
Есть сервер с apache, на нем, например, 20 virtualhost-ов.
Хотелось бы получить статистику популярности этих хостов друг относительно друга.
Т.е. какой сайт чаще запрашивали, какой больше трафика съел, желательно в наглядном виде (например, pie chart). Подскажите кто знает - каким образом это можно реализовать? Перерыл весь инет, но так и не нашёл способа.
Везде предлагают awstats и webalizer, но это не то - они делают статистику по конкретному домену, а мне нужно именно сравнение, чтобы выявить сайты, которые дают наибольшую нагрузку на сервер (хотя бы по кол-ву запросов в access_log).
Например, как здесь: http://people.apache.org/~vgritsenko/stats/daily.html
Кто знает какими средствами и как это можно реализовать - напишите пожалуйста здесь или на мыло murznn(гав-гав)gmail(точко)com
Комментарий от MurzNN — Январь 20, 2009 @ 1:25 am