Недавно столкнулся с задачей, которая знакома каждому системному администратору — нужно было проанализировать логи доступа для нескольких десятков сайтов на сервере. Обычно это превращается в рутинную работу: заходишь в каждую папку, находишь логи, запускаешь GoAccess отдельно для каждого домена… В общем, тоска зеленая.
Решил потратить выходные на написание скрипта, который бы делал всю эту работу автоматически. Получилось довольно неплохо — теперь делюсь с сообществом.
https://gitlab.com/avtobys/log_analysis
Что меня раздражало в стандартном подходе
Представьте ситуацию: у вас сервер с 300+ сайтами, каждый в своей папке, логи могут быть как свежие, так и заархивированные. И вам нужно:
- Найти все домены
- Для каждого собрать все его лог-файлы
- Запустить анализ
- Получить читаемые отчеты
Делать это вручную — верный способ потратить полгода и при этом что-то забыть или перепутать.
Архитектурный подход
Первое, с чем пришлось разобраться — это разнообразие структур каталогов. BitrixVM складывает логи в одном месте, Plesk — в другом, «чистый» Nginx — в третьем. Вместо того чтобы делать универсальный парсер (который неизбежно где-то сломается), решил пойти по пути выбора из готовых шаблонов.
При запуске скрипт показывает интерактивное меню со стрелочками — выбираешь нужную архитектуру и все. Сейчас поддерживается:
- BitrixVM
- Plesk
- cPanel
- Стандартный Nginx
- Apache2
Добавить новую структуру — дело пяти минут, нужно только прописать путь в массиве.
Умная обработка файлов логов
Тут была интересная задачка. Логи могут быть в разных состояниях:
- Текущий файл
access.log - Ротированные
access.log.1,access.log.2и так далее - Сжатые архивы
access.log.1.gz,access.log.2.gz
Плюс нужно было сделать выбор глубины анализа. Иногда достаточно посмотреть только свежие данные, а иногда нужна полная картина за месяц-два.
Решение получилось элегантным — скрипт сначала находит все файлы для домена, сортирует по дате модификации, а потом берет нужное количество самых свежих. При этом автоматически обрабатывает сжатые файлы через zcat.
# Пример того, как это работает внутри
find_and_sort_logs() {
find "$log_dir" -name "${domain}*.access.log*" |
sort -t. -k3,3n | tail -n "$depth"
}
Фильтрация — это важно
Одна из полезных фишек — возможность фильтрации по доменам и IP-адресам. Представьте, что вы расследуете инцидент с конкретного IP или хотите посмотреть статистику только для определенных сайтов.
Фильтрация по IP поддерживает как отдельные адреса, так и подсети в нотации CIDR. Например:
./log_analysis.sh -i "192.168.1.0/24,8.8.8.8"
Это особенно полезно, когда нужно исключить из анализа ботов или, наоборот, сосредоточиться на трафике с определенных сетей.
GoAccess — мощь в простоте
Для генерации отчетов использую GoAccess. Эта утилита просто великолепна — быстрая, информативная, генерирует красивые HTML-отчеты с интерактивными графиками.
Единственная проблема с GoAccess — нужно правильно настроить формат логов. В скрипте это решается автоматическим определением формата на основе выбранной архитектуры сервера.
Практические результаты
После того как скрипт отработает, получаете:
- Отдельный HTML-отчет для каждого домена
- Сводный отчет по всем сайтам
- Все файлы аккуратно сложены в папку
log_reports
Отчеты содержат все основные метрики:
- Количество уникальных посетителей
- Самые популярные страницы
- Коды ответов сервера
- Браузеры и операционные системы
- География посетителей
- И много чего еще
Установка и использование
Процесс максимально простой:
- Ставим GoAccess (если еще не установлен):
sudo apt-get install goaccess # для Debian/Ubuntu
sudo yum install goaccess # для CentOS/RHEL
- Скачиваем скрипт и делаем исполняемым:
chmod +x log_analysis.sh
- Запускаем с правами root:
sudo ./log_analysis.sh
Дальше просто следуем интерактивному меню.
Реальный кейс использования
На прошлой неделе пришлось разбираться с подозрительно высокой нагрузкой на один из серверов. Раньше я бы пол дня копался в логах разных сайтов, пытаясь найти источник проблемы.
С новым скриптом запустил анализ с фильтрацией по времени (взял только свежие логи), получил отчеты и сразу увидел, что один из сайтов получает аномально много запросов с конкретного IP-диапазона. Оказалось, кто-то запустил агрессивный краулер без соблюдения robots.txt.
Проблему решили за 10 минут блокировкой на уровне файрвола, а весь анализ занял меньше пяти минут.
Автоматизация рутинных задач — это не лень, а здравый смысл. Время, потраченное на написание такого скрипта, окупается уже после нескольких использований. А главное — снижается вероятность человеческих ошибок при анализе.
Если занимаетесь администрированием веб-серверов, рекомендую попробовать. Возможно, вам тоже понравится такой подход к анализу логов.
Надоели танцы с бубнами вокруг лог файлов, флуд, парсинг, AI боты, бестолковые боты?