Логи Apache · 3 min read · Jan 28, 2026

Разделение логов Apache с помощью vlogger

Разделение логов Apache с помощью vlogger

Версия 1.0
Автор: Фалко Тимме

Vlogger — это небольшой инструмент, с помощью которого вы можете записывать логи Apache, разбитые по виртуальным хостам и дням. С помощью vlogger нам нужно добавить только одну директиву CustomLog в нашу глобальную конфигурацию Apache, и она будет записывать логи доступа для каждого виртуального хоста и дня. Таким образом, вам не нужно разделять общий лог доступа Apache на логи доступа для каждого виртуального хоста каждый день, и вам не нужно настраивать Apache на запись одного лога доступа на виртуальный хост (что может быстро привести к исчерпанию дескрипторов файлов).

В конце этого руководства я покажу вам, как использовать webalizer для создания статистики из логов доступа Apache.

Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

Я протестировал vlogger на системе Debian Etch, где Apache2 уже установлен и работает.

2 Установка и настройка vlogger

Чтобы установить vlogger, просто выполните

apt-get install vlogger

После этого нам нужно изменить строку LogFormat (существует несколько строк LogFormat - по крайней мере, измените ту, которая называется combined) в /etc/apache2/apache2.conf. Мы должны добавить строку %v в начале:

vi /etc/apache2/apache2.conf

| [...] #LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined [...] |

Затем добавьте следующую строку CustomLog в тот же файл (вы можете поместить ее сразу после строки LogFormat):

vi /etc/apache2/apache2.conf

| [...] CustomLog "| /usr/sbin/vlogger -s access.log /var/log/apache2" combined [...] |

Это единственная директива CustomLog, которая нам нужна в нашей конфигурации Apache. Пожалуйста, отключите все другие директивы CustomLog, особенно в ваших конфигурациях виртуальных хостов!

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

Теперь перезапустите Apache:

/etc/init.d/apache2 restart

Vlogger теперь создаст подкаталоги в директории /var/log/apache2, по одному на каждый виртуальный хост, и он создаст логи доступа, которые содержат текущую дату в имени файла. Он также создаст символическую ссылку с именем access.log, которая указывает на текущий лог-файл.

Предположим, у нас есть два виртуальных хоста, www.example.com и www.test.tld. Тогда вот как будет выглядеть директория /var/log/apache2:

/var/log/apache2/
www.example.com/
06042007-access.log
06052007-access.log
06062007-access.log
access.log -> 06062007-access.log
www.test.tld/
06042007-access.log
06052007-access.log
06062007-access.log
access.log -> 06062007-access.log

Чтобы узнать, какие другие директивы командной строки vlogger вы можете добавить в строку CustomLog, посмотрите на

man vlogger

3 Создание статистики с помощью webalizer

В этой главе я покажу вам, как вы можете создать статистику из разделенных лог-файлов с помощью webalizer. Снова предполагаю, что у вас есть два виртуальных хоста, www.example.com и www.test.tld, и эти виртуальные хосты имеют корневые директории документов /var/www/www.example.com/web и /var/www/www.test.tld/web (важно, чтобы имена серверов были в путях корневых директорий документов, иначе следующая процедура не сработает). Я хотел бы поместить статистику в директории /var/www/www.example.com/web/stats и /var/www/www.test.tld/web/stats, поэтому они должны уже существовать.

Сначала давайте установим webalizer:

apt-get install webalizer

Посмотрите на

man webalizer

чтобы увидеть, как работает webalizer. В основном, чтобы создать статистику для www.example.com из лога доступа за вчера, вы можете использовать эту команду:

/usr/bin/webalizer -c /etc/webalizer/webalizer.conf -n www.example.com \
-s www.example.com -r www.example.com -q -T -o /var/www/www.example.com/web/stats \
/var/log/apache2/www.example.com//bin/date -d "1 day ago" +%m%d%Y-access.log

( /etc/webalizer/webalizer.conf — это местоположение конфигурации webalizer по умолчанию для Debian. /bin/date -d “1 day ago” +%m%d%Y выводит дату вчерашнего дня именно так, как нам нужно, чтобы мы могли передать лог доступа за вчера webalizer, не зная точную дату.)

Конечно, мы не хотим запускать такую команду вручную для каждого виртуального хоста, поэтому мы пишем небольшой скрипт оболочки, который читает директорию /var/log/apache2 и создает статистику для каждого виртуального хоста, у которого есть логи в этой директории. Я назову скрипт webstats и помещу его в директорию /usr/local/sbin:

vi /usr/local/sbin/webstats

| #!/bin/sh logdir=/var/log/apache2 webalizerconf=/etc/webalizer/webalizer.conf yesterdaysdate=`/bin/date -d "1 day ago" +%m%d%Y` cd ${logdir} for directory in * do if [ -d ${directory} ]; then /usr/bin/webalizer -c ${webalizerconf} -n ${directory} \ -s ${directory} -r ${directory} -q -T -o /var/www/${directory}/web/stats \ ${logdir}/${directory}/${yesterdaysdate}-access.log fi done exit 0 |

Мы должны сделать этот скрипт исполняемым:

chmod 755 /usr/local/sbin/webstats

Наконец, мы создаем задание cron, которое вызывает скрипт /usr/local/sbin/webstats каждую ночь в 04:00:

crontab -e

| 0 4 * * * /usr/local/sbin/webstats &> /dev/null |

После того как задание cron выполнится в первый раз, вы можете перейти на www.example.com/stats и www.test.tld/stats, чтобы увидеть статистику в вашем браузере. Хорошей идеей будет защитить директории статистики паролем с помощью .htaccess/.htpasswd.

4 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.