Vector вместо grep+awk для парсинга логов
Как я устал от цепочек tail | grep | awk | sed и переписал пайплайн на Vector.
На прошлом дежурстве я в четвёртый раз за неделю писал в терминале что-то вроде:
tail -F /var/log/nginx/access.log | grep -E ' (4[0-9]{2}|5[0-9]{2}) ' | awk '{print $1, $7, $9}' | sort | uniq -c | sort -rn | head -20
И понял, что эта команда — у меня в истории шелла третий раз за день. Значит, пора её отдать в нормальный инструмент, а не переписывать каждый раз.
Что не устраивало в grep+awk
- Сложно добавить новый источник — приходится переписывать всю цепочку.
- Нет состояния: нельзя «покажи мне только то, чего не было в прошлый час».
- Парсинг регулярками хрупкий — nginx поменял формат лога, всё развалилось.
- Метрики приходится считать отдельно в cron'е.
Vector
Vector — это от Datadog, написан на Rust, бинарь один, конфиг в TOML/YAML. Источник → трансформы → сток. Умеет читать файлы (включая ротацию), journald, socket, kafka; писать в Loki, Elasticsearch, S3, ClickHouse, Prometheus remote write — что угодно.
Минимальный конфиг для nginx-логов в Loki:
[sources.nginx]
type = "file"
include = ["/var/log/nginx/*.log"]
read_from = "beginning"
[transforms.parsed]
type = "remap"
inputs = ["nginx"]
source = '''
. = parse_apache_log!(.message)
.status = to_int!(.status)
'''
[sinks.loki]
type = "loki"
inputs = ["parsed"]
endpoint = "http://loki.internal:3100"
labels.host = "web-01"
После этого в Grafana я просто фильтрую по status >= 400 — без регулярок в терминале, с агрегацией по часу/дню, с алертами в Alertmanager, если что-то пошло не так.
Что в итоге
За три месяца использования — ровно один баг (Vector 0.34 падал на очень длинных строках, обновился до 0.37, всё ок). Tail -F в терминале я всё ещё использую, но только для разовых разборов, а не для пайплайнов.