GoAccess – один из инструментов формирования сводного отчета в формате HTML по логам веб-сервера. По сути это инструмент командной строки, который принимает на вход содержимое логов и формирует из них html файлик с отчетом, который удобно просматривать. Чтобы отчеты формировались без нашей помощи, необходим скрипт автоматизации, который можно запускать по расписанию. Под катом скрипт с описанием.
Установка goaccess
на ubuntu:
sudo apt install goaccess
Для запуска формирования отчетов можно, конечно, для каждого лога написать в крон собственную команду, но если логов много – это не очень удобно. Мне достаточно, чтобы для всех логов формировались однотипные отчеты, и я написал скрипт, который будет считывать файлик со списком логов и складывать сгенерированные HTML файлы в специальную папку, к которой есть доступ по web. Таким образом в файл можно будет добавлять/удалять записи в простом специальном файлике, и при следующей автогенерации отчетов изменения уже будут учтены. Плюс к этому, скрипт генерирует файл index.html, в котором содержатся ссылки на все сгенерированные отчеты. Скрипт умеет склеивать все файлы лога, созданные logrotate
, в том числе заархивированные .gz
.
Скрипт goaccess-build
:
#!/bin/bash
LOG_LIST_FILE='/root/goaccess/logs'
LOG_DIR='/var/log/apache2'
HTML_DIR='/var/www/html/goaccess'
echo "<html><head><title>LOGS</title></head><body><ul>" > $HTML_DIR/index.html
while IFS=' ' read -r NAME FORMAT
do
if [ "$FORMAT" == '' ]; then
FORMAT='COMBINED';
fi
LOG_FILE_CUR="${LOG_DIR}/${NAME}.log"
LOG_FILE_PREV="${LOG_DIR}/${NAME}.log.*[^a-z]"
LOG_FILE_ARC="${LOG_DIR}/${NAME}.log.*.gz"
if [ ! -f "$LOG_FILE_CUR" ]; then
continue
fi
CAT_CMD="cat $LOG_FILE_CUR";
if ls $LOG_FILE_PREV >/dev/null 2>&1; then
CAT_CMD="$CAT_CMD $LOG_FILE_PREV"
fi
if ls $LOG_FILE_ARC >/dev/null 2>&1; then
CAT_CMD="zcat $LOG_FILE_ARC && $CAT_CMD"
fi
eval "(${CAT_CMD}) | goaccess - --log-format=$FORMAT --output=${HTML_DIR}/${NAME}.html >/dev/null 2>&1"
HTML_SIZE=$(stat -c%s "${HTML_DIR}/${NAME}.html" | numfmt --to=iec)
echo "<li><a href=\"${NAME}.html\">${NAME}</a> <small>[${HTML_SIZE}]</small></li>" >> $HTML_DIR/index.html
done < $LOG_LIST_FILE
echo "</ul></body></html>" >> $HTML_DIR/index.html
Для работы скрипта установите корректные значения переменных для вашего сервера:
LOG_LIST_FILE='/root/goaccess/logs'
LOG_DIR='/var/log/apache2'
HTML_DIR='/var/www/html/goaccess'
Файл со списком логов
В каждой строке файла LOG_LIST_FILE
может быть указано имя лога (без завершающего .log*
), либо имя и через пробел формат (для команды goaccess
) лога. Если формат лога не указан, то используется формат COMBINED
.
Перевод строки в конце последней записи в файле обязателен.
Пример файла списка логов:
my.virtual.host-access
other_vhosts_access VCOMBINED
Скачать
Код и описание скрипта доступны так же на github:
https://github.com/konovaltsev/goaccess-automation