Ротация логов в nginx. Анализ логов.

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

Для чего служит ротация? Ротация – это переодическое архивирование логов сервера. Зачастую, когда сервер испытывает нагрузки, логи ведуться очень интенсивно, и если не производить ротацию, то за считанные дни они могу отъесть все свободное место на винте. Так же, надо понимать, что работа сервера, процесс непрерывный, значит и ротацию необходимо провести таким образом, что-бы не навредить статистике, или не потерять записи в логи.

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

Ротация логов

За время установки сервера и эксперементов с ним, я выяснил одну маленькую деталь, вот она:

du -sh error.log localhost.access.log access.log 
645M    error.log
2,1M    localhost.access.log
2,1M    access.log
du -sh error.log localhost.access.log access.log 
645M	error.log
2,1M	localhost.access.log
2,1M	access.log

Как видно, error.log оттяпал 645Mb без всяких проблем. Конечно, можно просто удалить лог-файл, а можно написать коротенький скрипт, который будет делать ротацию логов, а можно воспользоваться утилитой logrotate. К тому же на серверах, удаление логов просто не возможно, они могут нести в себе ценную информацию для системных администраторов.

Способ первый. Скрипт.

Я написал простенький скрипт, который поможет вам проводить ротацию логов, экономя ваше место на диске и ваше время.

#!/bin/bash
 
cd /home/www/linuxspace.org/log/
mv access.log access.log.bak
mv error.log  error.log.bak
mv localhost.access.log localhost.access.log.bak
sudo pkill -USR1 nginx -u root
tar cjf `date '+%d-%B-%Y'.tar.bz2` *.bak
mv *.tar.bz2 /home/www/linuxspace.org/archives/
rm *.bak
 
#---------------------------------------------------
#or pidof nginx
#or cat /home/www/linuxspace.org/nginx.pid > $$
#or pgrep nginx -u root
#or sudo pkill -f nginx -u root
#--------------------------------------------------
#!/bin/bash

cd /home/www/linuxspace.org/log/
mv access.log access.log.bak
mv error.log  error.log.bak
mv localhost.access.log localhost.access.log.bak
sudo pkill -USR1 nginx -u root
tar cjf `date '+%d-%B-%Y'.tar.bz2` *.bak
mv *.tar.bz2 /home/www/linuxspace.org/archives/
rm *.bak

#---------------------------------------------------
#or pidof nginx
#or cat /home/www/linuxspace.org/nginx.pid > $$
#or pgrep nginx -u root
#or sudo pkill -f nginx -u root
#--------------------------------------------------

Те строки которые закоментированны, это альтернативные способы, которые я нашел в поиске оптимального для меня, по этому я специально сохранил их, если кто-то решит использовать их.

Принцип работы скрипта прост до безобразия.
В первой строке переходим в папку с логами.
Потом переименовываем все логи.
Далее отсылаем на сервер сигнал USR1
Далее делаем backup.
И переносим архив в папку для архивов.
Удаляем старые файлы

Вот как будет выглядеть результат.

ls -la
итого 248
drw-r--r-- 2 www  www    4096 2009-06-27 00:00 .
drwxr--r-- 7 www  www    4096 2009-06-27 02:18 ..
-rw-r--r-- 1 www  www  231534 2009-06-22 18:57 22-Июнь-2009.tar.bz2
-rw-r--r-- 1 root root   1596 2009-06-24 13:09 24-Июнь-2009.tar.bz2
-rw-r--r-- 1 root root   1605 2009-06-27 00:00 27-June-2009.tar.bz2
ls -la
итого 248
drw-r--r-- 2 www  www    4096 2009-06-27 00:00 .
drwxr--r-- 7 www  www    4096 2009-06-27 02:18 ..
-rw-r--r-- 1 www  www  231534 2009-06-22 18:57 22-Июнь-2009.tar.bz2
-rw-r--r-- 1 root root   1596 2009-06-24 13:09 24-Июнь-2009.tar.bz2
-rw-r--r-- 1 root root   1605 2009-06-27 00:00 27-June-2009.tar.bz2

Мы получим архив, с точной датой, когда он был создан. Если сервер перегружен и логи пишутся часто, то ротацию желательно выполнять раз в один два дня.
Для этого создаем задание crontab:

crontab -e
# m h  dom mon dow   command
00 00 * * * sh /home/www/linuxspace.org/private/logsrotation.sh
crontab -e
# m h  dom mon dow   command
00 00 * * * sh /home/www/linuxspace.org/private/logsrotation.sh

Т.е. Каждый день в 00:00 будет проводиться ротация логов. Не забывайте это все делается для пользователя www из группы www, по этому задание должно стоять в рутовском crontab и скрипт исполняться с правами рута.

Способ воторой. logrotate

Скорее всего программа есть уже у вас в системе, на установку время тратить не будем.
Файлы конфигурации лежат по адресу /etc/logrotate.d/:

ls -la /etc/logrotate.d/
итого 80
drwxr-xr-x   2 root root  4096 2009-06-26 16:16 .
drwxr-xr-x 152 root root 12288 2009-06-27 02:04 ..
-rw-r--r--   1 root root   293 2009-06-11 06:26 apache2
-rw-r--r--   1 root root   126 2009-04-17 08:17 apport
-rw-r--r--   1 root root    84 2009-04-17 07:27 apt
-rw-r--r--   1 root root    79 2009-02-10 15:45 aptitude
-rw-r--r--   1 root root   148 2009-04-01 11:32 checkbox
-rw-r--r--   1 root root   248 2009-04-17 12:20 cups
-rw-r--r--   1 root root   111 2009-01-07 14:32 dpkg
-rw-r--r--   1 root root   146 2009-04-07 19:49 jockey-common
-rw-r--r--   1 root root   101 2009-04-20 20:44 mpd
-rw-r--r--   1 root root   837 2009-05-14 13:39 mysql-server
-rw-r--r--   1 root root   384 2009-06-27 03:49 nginx
-rw-r--r--   1 root root    94 2009-02-20 19:25 ppp
-rw-r--r--   1 root root   114 2009-03-02 12:03 unattended-upgrades
-rw-r--r--   1 root root   189 2009-03-27 19:18 winbind
-rw-r--r--   1 root root   106 2009-04-09 04:44 wpa_action
-rw-r--r--   1 root root   114 2009-04-09 04:44 wpa_supplicant
ls -la /etc/logrotate.d/
итого 80
drwxr-xr-x   2 root root  4096 2009-06-26 16:16 .
drwxr-xr-x 152 root root 12288 2009-06-27 02:04 ..
-rw-r--r--   1 root root   293 2009-06-11 06:26 apache2
-rw-r--r--   1 root root   126 2009-04-17 08:17 apport
-rw-r--r--   1 root root    84 2009-04-17 07:27 apt
-rw-r--r--   1 root root    79 2009-02-10 15:45 aptitude
-rw-r--r--   1 root root   148 2009-04-01 11:32 checkbox
-rw-r--r--   1 root root   248 2009-04-17 12:20 cups
-rw-r--r--   1 root root   111 2009-01-07 14:32 dpkg
-rw-r--r--   1 root root   146 2009-04-07 19:49 jockey-common
-rw-r--r--   1 root root   101 2009-04-20 20:44 mpd
-rw-r--r--   1 root root   837 2009-05-14 13:39 mysql-server
-rw-r--r--   1 root root   384 2009-06-27 03:49 nginx
-rw-r--r--   1 root root    94 2009-02-20 19:25 ppp
-rw-r--r--   1 root root   114 2009-03-02 12:03 unattended-upgrades
-rw-r--r--   1 root root   189 2009-03-27 19:18 winbind
-rw-r--r--   1 root root   106 2009-04-09 04:44 wpa_action
-rw-r--r--   1 root root   114 2009-04-09 04:44 wpa_supplicant

Так же, еще ксть конфиг, /etc/logrotate.conf
Как видно из списка выше, есть файл конфигурации и для nginx

Открываем его:

/home/www/linuxspace.org/log/*.log {
        daily #ежедневная ротация
        missingok #отсутствие файла не является ошибкой
        rotate 52 #хранится история за 52 дней
        compress #ротируемые файлы сжимаются
        delaycompress #ротируемый файл не сжимается, остальные - сжимаются
        notifempty #не обрабатывать пустые файлы
        #create 640 root adm #в этом нет необходимости
        sharedscripts #prerotate/postrotate выполняются только 1 раз
        #выполняется до начала ротации, в данном случае сбор статистики
        prerotate
        /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -update -config=linuxspace.org
        endscript
        #выполняется после ротации,в данном случае посылаем на сервер сигнал USR1
        postrotate
                [ ! -f /home/www/linuxspace.org/nginx.pid ] || kill -USR1 `cat /home/www/linuxspace.org/nginx.pid`
        endscript
}
/home/www/linuxspace.org/log/*.log {
        daily #ежедневная ротация
        missingok #отсутствие файла не является ошибкой
        rotate 52 #хранится история за 52 дней
        compress #ротируемые файлы сжимаются
        delaycompress #ротируемый файл не сжимается, остальные - сжимаются
        notifempty #не обрабатывать пустые файлы
        #create 640 root adm #в этом нет необходимости
        sharedscripts #prerotate/postrotate выполняются только 1 раз
        #выполняется до начала ротации, в данном случае сбор статистики
        prerotate
        /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -update -config=linuxspace.org
        endscript
        #выполняется после ротации,в данном случае посылаем на сервер сигнал USR1
        postrotate
                [ ! -f /home/www/linuxspace.org/nginx.pid ] || kill -USR1 `cat /home/www/linuxspace.org/nginx.pid`
        endscript
}

Теперь когда все готово. Можно провести запуск logrotate в отладочном режиме. Т.е. логи тронуты не будут.
Вы же сможете удостовериться, что все настроенно правильно, увидeв вывод системной информации:

sudo logrotate -d /etc/logrotate.d/nginx
sudo logrotate -d /etc/logrotate.d/nginx

Если все окей, запускаем в рабочем режиме:

sudo logrotate -v -f /etc/logrotate.d/nginx
sudo logrotate -v -f /etc/logrotate.d/nginx

Опции:
-d – запуск в отладочном режиме
-v – вывод диагностики на экран во время ротации
-f – Заставляет logrotate выполнить ротацию логов.

Анализ логов, awstats, webalizer, analog

Анализ логов, важная штука, для этих целей существует целый набор утилит.
Все они бесплатны, хороши и доступны для скачивания с сети или установки с репозитория. \
Я буду рассматривать три наиболее популярные, это: awstats, webalizer и analog
Что бы время даром не терять, установи их все в систему одной командой:

aptitude install awstats webalizer analog
aptitude install awstats webalizer analog

Analog
Программа проста и все что необходимо, для того, что-бы получить отчет, подправить пару конфигов.
Первый, это:

nano /usr/local/nginx/conf/nginx.conf
nano /usr/local/nginx/conf/nginx.conf

Указываем нужный формат для логов:

access_log  /home/www/linuxspace.org/log/access.log combined;
access_log  /home/www/linuxspace.org/log/access.log combined;

Второй, это:

nano /etc/analog.cfg
nano /etc/analog.cfg

Там просто указываем тех. данные.

OUTFILE /home/www/linuxspace.org/log/report.html
HOSTNAME "[linuxspace.org]"
LANGFILE /usr/share/analog/lang/ru.lng
OUTFILE /home/www/linuxspace.org/log/report.html
HOSTNAME "[linuxspace.org]"
LANGFILE /usr/share/analog/lang/ru.lng

Названия говорят сами за себя и я думаю нет необходимости их комментить.
Теперь можно выполнить программу:

sudo analog
sudo analog

и ищем отчет там, где его указали в конфиге analog.
Вы увидите там много полезной информации такого плана:

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

sudo webalizer -h
sudo webalizer -h

Файл конфига лежит там, где и должен лежать:

nano /etc/webalizer/webalizer.conf
nano /etc/webalizer/webalizer.conf

Самое вкусное из конфига:

# Определяет журнал сервера
LogFile        /home/www/linuxspace.org/log/access.log
 
# Определяет месторасположение отчетов Webalizer
OutputDir      /home/www/linuxspace.org/stats/web/
 
# Имя хоста, который мониторится
HostName   localhost
 
# Задает имя файла, в котором будет содержаться информация о посещении веб-сервера на протяжении одного года
HistoryName    HistoryName webalizer.hist
 
#Возрастающая обработка позволяет использовать несколько относительно небольших файлов #журналов вместо одного огромного. Данная опция полезна для больших сайтов, период ротации #журналов которых меньше, чем период ротации обыкновенных веб-серверов.
Incremental
 
# Задает заголовок отчета. Русские заголовки поддерживаются (при условии настроенной локализации системы)
ReportTitle 
 
# Определяет расширение для файлов-отчетов
HTMLExtension
 
# Позволяет использовать безопасное соединение HTTPS для просмотра статистики
UseHTTPS
 
# Директива PageType указывает расширения файлов, которые будут считаться веб-страницами.
PageType     htm*
PageType     cgi
PageType     phtml
PageType     php*
PageType     pl
# Определяет журнал сервера
LogFile        /home/www/linuxspace.org/log/access.log

# Определяет месторасположение отчетов Webalizer
OutputDir      /home/www/linuxspace.org/stats/web/

# Имя хоста, который мониторится
HostName   localhost

# Задает имя файла, в котором будет содержаться информация о посещении веб-сервера на протяжении одного года
HistoryName    HistoryName webalizer.hist

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

# Задает заголовок отчета. Русские заголовки поддерживаются (при условии настроенной локализации системы)
ReportTitle 

# Определяет расширение для файлов-отчетов
HTMLExtension

# Позволяет использовать безопасное соединение HTTPS для просмотра статистики
UseHTTPS

# Директива PageType указывает расширения файлов, которые будут считаться веб-страницами.
PageType     htm*
PageType     cgi
PageType     phtml
PageType     php*
PageType     pl

Опции Webalizer:
-c файл – альтернативный файл конфигурации. По умолчанию используется файл /etc/webalizer.conf.
-n name – имя машины, которое будет отображено при выводе статистики.
-o каталог – каталог, в который будут помещены файлы статистики.
-t название – заголовок отчета.
-F (clf | ftp | squid) – тип журнала: clf или ftp или squid.

Запуск:

sudo webalizer
sudo webalizer

Вот пример отчета.

Awstats
Awstats можно устанавливать разными способами, в принципе без разницы, так как написан он на Perl, и без интерпритатора работать не может.
Ставим:

sudo aptitude install awstats
sudo aptitude install awstats

Или загружаем последнюю версию с http://awstats.sourceforge.net

Все настройки AWstats находятся в директории /etc/awstats, это при условии, что вы ставили его и репов, в противном случае ищите их в скаченном ахиве по адресу awstats-6.9/wwwroot. Каждый конфиг именуется слудющим образом: awstats.название_хоста.conf. Например, для linuxspace.org файл будет именоваться следующим образом: awstats.linuxspace.org.conf .

По умолчанию (имею ввиду, что ставили из репов), AWstats предоставляет дефолтный файл конфигурации: /etc/awstats/awstats.conf. Чтобы сделать свою конфигурацию, необходимо просто скопировать дефотный файл и отредактировать его:

sudo cp /etc/awstats/awstats.conf /etc/awstats/awstats.linuxspace.org.conf
sudo cp /etc/awstats/awstats.conf /etc/awstats/awstats.linuxspace.org.conf

Если вы качали сырцы, то делаем так:

cd /место_куда_скачали_архив/
tar xvf awstats-6.9.tar.gz
cd awstats-6.9/wwwroot/
sudo cp awstats.model.conf /etc/awstats/awstats.localhost.conf
cd /место_куда_скачали_архив/
tar xvf awstats-6.9.tar.gz
cd awstats-6.9/wwwroot/
sudo cp awstats.model.conf /etc/awstats/awstats.localhost.conf

Далее правим конфиг:

sudo nano /etc/awstats/awstats.linuxspace.org.conf
sudo nano /etc/awstats/awstats.linuxspace.org.conf

Анализируемый лог файл:

LogFile="LogFile=/home/www/linuxspace.org/log/access.log"
# Хост, чей лог будет анализироваться
SiteDomain="linuxspace.org" 
# Директория, куда будет складироваться сгенерированная статистика посещений
DirData="."
#Тип лог файлов которые вы хотите анализировать
LogType=W
#Возможность обновлять статистику из браузера
AllowToUpdateStatsFromBrowser=1
#Путь к cgi-bin 
DirCgi="/cgi-bin"
# Язык интерфейса
Lang="ru"
# Декодирование поисковых фраз, по кот. был переход на сайт
LoadPlugin="decodeutfkeys"
# График стран на основе IP посетителей (снижает скорость работы анализатора на 10%!)
LoadPlugin="geoipfree"
LogFile="LogFile=/home/www/linuxspace.org/log/access.log"
# Хост, чей лог будет анализироваться
SiteDomain="linuxspace.org" 
# Директория, куда будет складироваться сгенерированная статистика посещений
DirData="."
#Тип лог файлов которые вы хотите анализировать
LogType=W
#Возможность обновлять статистику из браузера
AllowToUpdateStatsFromBrowser=1
#Путь к cgi-bin 
DirCgi="/cgi-bin"
# Язык интерфейса
Lang="ru"
# Декодирование поисковых фраз, по кот. был переход на сайт
LoadPlugin="decodeutfkeys"
# График стран на основе IP посетителей (снижает скорость работы анализатора на 10%!)
LoadPlugin="geoipfree"

Для корректной работы плагинов, нужен дополнительный пакет

sudo aptitude install libgeo-ipfree-perl
sudo aptitude install libgeo-ipfree-perl

Запуск программы из консоли

/usr/bin/perl /usr/lib/cgi-bin/awstats.pl -update -config=linuxspace.org

На этом пожалуй все, много полезной информации по всем трем програмам, вы найдете в man. А вдумчивое чтение, обеспечит всей необходимой и недостающей тут информации.