Кейс · CLI-утилита · Python

logslice: анализ логов без зависимостей

CLI на Python 3.11+ только на стандартной библиотеке: потоково разбирает логи nginx/apache (combined), JSON-lines, logfmt и syslog (gz, bz2, xz тоже), считает статистику и топы, кластеризует похожие ошибки, ищет скачки нагрузки по z-score и EWMA и собирает один HTML-отчёт с SVG-графиками и тепловой картой. Пет-проект.

  • Python
  • stdlib only
  • CLI
  • SVG
  • pytest
  • ruff
  • mypy
  • GitHub Actions
  • Docker

01 · Как выглядит

Скриншоты

Скриншот проекта «logslice: анализ логов без зависимостей» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «logslice: анализ логов без зависимостей» на экране телефона, 390 пикселей
Телефон, 390 px

02 · О проекте

Что это и зачем

logslice — консольная утилита на Python для разбора логов: читает nginx/apache combined, JSON-lines, logfmt и syslog, в том числе сжатые gz, bz2 и xz, и показывает статистику, топы, кластеры похожих ошибок и скачки нагрузки. Пет-проект.

Только стандартная библиотека Python 3.11+: установка ничего не скачивает. Файл читается потоком, в памяти живут счётчики, а не строки; ошибки группируются по шаблону с нормализацией чисел и идентификаторов, аномалии ищутся статистическим порогом (z-score или EWMA). Результат один и тот же для терминала, JSON и HTML.

Ограничения

Живой версии нет: это консольная утилита. Скриншоты сняты на синтетических логах с вымышленными адресами из документационных диапазонов.

Времена показываются в UTC. Автоопределение смотрит только первые 300 строк и один формат на вход. Аномалии это статистический порог без сезонности: на шумных данных бывают слабые срабатывания.

Разбор идёт в одном потоке. Замер скорости один, на одной машине: на другом железе и системе цифры будут другими.

serve не предназначен для публикации в интернет: HTTP без TLS и аутентификации, только loopback.

Что внутри

  • Команды stats, top, errors, slice, anomalies, report и serve; общие флаги --format, --from/--to (ISO, epoch или -90m), --json, --color, коды возврата 0/1/2/3/4/130
  • Форматы: nginx/apache combined, JSON-lines, logfmt, syslog (RFC 3164 и 5424) с автоопределением по первым 300 строкам; gz, bz2 и xz по magic-байтам, с лимитами строки, объёма и степени сжатия
  • Кластеры похожих ошибок по шаблону: счёт, доля, интервал и примеры
  • Аномалии: скачки и провалы RPS, скачки ошибок, методы zscore и ewma с настраиваемыми окном и порогом
  • HTML-отчёт одним файлом без внешних запросов: запросы по времени, тепловая карта день недели × час, топы, распределение задержек, кластеры ошибок; строгий CSP, светлая и тёмная темы, у графиков есть табличная альтернатива
  • serve показывает тот же отчёт на 127.0.0.1 с проверкой Host и Origin; по умолчанию страница закрыта от индексации
  • 53 теста, ruff, mypy --strict; property-тесты hypothesis, «ядовитые» строки, gzip-бомба, XSS и ANSI-инъекции в выводе; axe на 390 и 1280 px: 0 нарушений
  • Один прогон на 1 млн строк combined (Windows 11, CPython 3.12.10): 8,2 с (около 122 тыс. строк/с), пик памяти 64 МБ

03 · Как запустить

Запуск одной командой

git clone <репозиторий по запросу> logslice
cd logslice
python -m venv .venv && .venv/bin/pip install .
logslice report access.log -o report.html

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.

Запросить код