GoAccess. Разбор логов web сервера

Автор: | 30 июня 2022

Писал пар­сер логов оши­бок и наткнул­ся на заме­ча­тель­ный про­ект — GoAccess. Попро­бо­вал обра­бо­тать им несколь­ко раз­ных логов — и мне очень понра­ви­лось. Неза­ме­ни­мая шту­ка, если Вы посто­ян­но веде­те рабо­ту над сво­им сай­том. Не буду рас­пи­сы­вать всё что может этот раз­бор­щик — у них на сай­те все опи­са­но и даже с кар­тин­ка­ми. Я лишь рас­ска­жу свой опыт обра­бот­ки логов.

Итак, раз­бор будет про­во­дить­ся на отдель­ной вир­ту­аль­ной машине (него­же этим утруж­дать рабо­чий веб сер­вер), раз­би­рать буду лог за про­шед­шие сут­ки и за весь пери­од нали­чия лог фай­лов (настра­и­ва­ет­ся в logrotate сколь­ко фай­лов у вас сохра­ня­ет­ся).

Для копи­ро­ва­ния фай­лов с веб сер­ве­ра на сер­вер мони­то­рин­га я исполь­зо­вал коман­ду scp, при­мер­ная запись в кроне будет выгля­деть так:

03 05 * * * scp -r /var/log/nginx/my_site-access.log.1 user@server:/home/folder/goaccess/

Так я ско­пи­рую лог про­шед­ше­го дня (у меня rotate логов настро­ен на 00:01) на сер­вер мони­то­рин­га, где буду его обра­ба­ты­вать.

Раз в неде­лю я буду копи­ро­вать точ­но так же все име­ю­щи­е­ся (к при­ме­ру за 20 дней) логи сай­та, и коман­да будет выгля­деть при­мер­но так:

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):

log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
date-format %d/%b/%Y
time-format %T

Теперь напи­шем два скрип­та для обра­бот­ки логов и созда­ния репор­тов в html файл. Вот такой скрипт для еже­днев­но­го лога:

#!/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 и затем раз­би­ра­ем лог в этот файл. Ну и затем уда­ля­ем этот лог файл.

Для еже­не­дель­но­го раз­бо­ра скрипт полу­чил­ся таким:

#!/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. В скрип­те пере­би­ра­ем все име­ю­щи­е­ся в пап­ке логи и обра­ба­ты­ва­ем их. После обра­бот­ки — уда­ля­ем все фай­лы.

Добав­ля­ем эти два скрип­та в крон на нуж­ное вре­мя, один еже­днев­но, вто­рой в пер­вый день неде­ли. На выхо­де полу­чим кра­си­вый и инфор­ма­тив­ный отчет.

Вот такой при­мер­но отчет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*