Писал парсер логов ошибок и наткнулся на замечательный проект — GoAccess. Попробовал обработать им несколько разных логов — и мне очень понравилось. Незаменимая штука, если Вы постоянно ведете работу над своим сайтом. Не буду расписывать всё что может этот разборщик — у них на сайте все описано и даже с картинками. Я лишь расскажу свой опыт обработки логов.
Итак, разбор будет проводиться на отдельной виртуальной машине (негоже этим утруждать рабочий веб сервер), разбирать буду лог за прошедшие сутки и за весь период наличия лог файлов (настраивается в logrotate сколько файлов у вас сохраняется).
Для копирования файлов с веб сервера на сервер мониторинга я использовал команду scp, примерная запись в кроне будет выглядеть так:
1 |
03 05 * * * scp -r /var/log/nginx/my_site-access.log.1 user@server:/home/folder/goaccess/ |
Так я скопирую лог прошедшего дня (у меня rotate логов настроен на 00:01) на сервер мониторинга, где буду его обрабатывать.
Раз в неделю я буду копировать точно так же все имеющиеся (к примеру за 20 дней) логи сайта, и команда будет выглядеть примерно так:
1 |
10 05 * * 1 scp -r /var/log/nginx/my_site-access.log.* user@server:/home/folder/goaccess/ |
Таким образом в первый день недели скопируются все файлы по маске, и даже заархивированные в gz
Переходим к разбору логов.
Для начала нужно определиться со форматом лог файла и выбрать его при запуске GoAccess. Затем проверяем формат даты и времени. У меня логи nginx и для моего формата нужно добавить следующие три строки в файл конфиг GoAccess (/etc/goaccess/goaccess.conf):
1 2 3 |
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u" date-format %d/%b/%Y time-format %T |
Теперь напишем два скрипта для обработки логов и создания репортов в html файл. Вот такой скрипт для ежедневного лога:
1 2 3 4 |
#!/bin/bash REPORT_NAME=$(date -u +%Y%m%d -d "yesterday") goaccess /home/folder/goaccess/my_site-access.log.1 -a -o /var/www/goaccess.logs/$REPORT_NAME.html -p /etc/goaccess/goaccess.conf rm -r /home/folder/goaccess/my_site-access.log.1 |
Сначала создаем имя файла равное вчерашней дате в формате YYYYMMDD и затем разбираем лог в этот файл. Ну и затем удаляем этот лог файл.
Для еженедельного разбора скрипт получился таким:
1 2 3 4 |
#!/bin/bash REPORT_NAME=big_report_$(date -u +%Y%m%d) zcat /home/folder/goaccess/my_site-access.log.*.gz | goaccess /home/folder/goaccess/my_site-access.log.1 -a -o /var/www/goaccess.logs/$REPORT_NAME.html -p /etc/goaccess/goaccess.conf find /home/folder/goaccess/ -name "*.*" -type f -delete |
Но нужно проверить наличие пакета zcat — который может прочитать логи в формате gz. В скрипте перебираем все имеющиеся в папке логи и обрабатываем их. После обработки — удаляем все файлы.
Добавляем эти два скрипта в крон на нужное время, один ежедневно, второй в первый день недели. На выходе получим красивый и информативный отчет.