PQ
PQ.Hosting

Валюта

Vector: замена Logstash которая весит в 20 раз меньше и работает быстрее

Автор
PQ
31 марта 2026
5 мин чтения
112 просмотров
Vector: замена Logstash которая весит в 20 раз меньше и работает быстрее

Logstash написан на JVM и ест 500–800 МБ памяти просто на старте. На VPS с 2–4 ГБ RAM это треть ресурсов только ради сборки логов. Vector написан на Rust, запускается за секунду и в простой конфигурации занимает 20–50 МБ. Функционально он не уступает — принимает логи из любых источников, трансформирует и отправляет куда угодно.

Установка

Debian / Ubuntu — официальный скрипт:

curl -1sLf 'https://repositories.timber.io/public/vector/cfg/setup/bash.deb.sh' | sudo bash
sudo apt install vector

Проверить версию и статус:

vector --version
sudo systemctl status vector

Конфигурационный файл:

sudo nano /etc/vector/vector.yaml

После изменений — валидировать и перезапустить:

vector validate /etc/vector/vector.yaml
sudo systemctl restart vector

Концепция: sources → transforms → sinks

Каждый пайплайн Vector состоит из трёх типов компонентов:

Sources — откуда читать логи. Файлы, systemd journal, syslog, stdin, Kafka, HTTP.

Transforms — что делать с событиями. Парсить, фильтровать, переименовывать поля, добавлять метаданные.

Sinks — куда отправлять. Файлы, Loki, Elasticsearch, S3, ClickHouse, HTTP, stdout.

Каждый компонент получает уникальный ID. Сinks указывают inputs — из каких компонентов брать данные. Так строится граф обработки.

Простейший пример: читать файл и писать в другой

sources:
  app_logs:
    type: file
    include:
      - /var/log/myapp/*.log
    read_from: beginning

sinks:
  output_file:
    type: file
    inputs:
      - app_logs
    path: /var/log/vector/myapp-%Y-%m-%d.log
    encoding:
      codec: text

Запустить и проверить что работает:

vector --config /etc/vector/vector.yaml

Читать из systemd journal

Источник для системных логов — все сервисы через journald:

sources:
  journal:
    type: journald
    include_units:
      - nginx
      - php8.1-fpm
      - postgresql

Без include_units — читает весь journal. На загруженном сервере это много.

Парсинг Nginx access log

Nginx пишет логи в текстовом формате. Vector умеет разобрать их в структурированные поля через VRL (Vector Remap Language):

sources:
  nginx_access:
    type: file
    include:
      - /var/log/nginx/access.log

transforms:
  parse_nginx:
    type: remap
    inputs:
      - nginx_access
    source: |
      . = parse_nginx_log!(string!(.message), "combined")

sinks:
  parsed_logs:
    type: file
    inputs:
      - parse_nginx
    path: /var/log/vector/nginx-%Y-%m-%d.json
    encoding:
      codec: json

После парсинга каждое событие содержит поля: client, method, path, status, size, referrer, agent. По ним удобно фильтровать и агрегировать.

VRL: язык трансформаций

VRL (Vector Remap Language) — встроенный язык для работы с событиями. Синтаксис похож на Python но типобезопасный.

Добавить поле с именем хоста:

source: |
  .hostname = get_hostname!()

Переименовать поле:

source: |
  .ip = del(.client_addr)

Фильтровать только ошибки (отбросить всё кроме статусов 4xx и 5xx):

source: |
  if !starts_with(to_string!(.status), "4") && !starts_with(to_string!(.status), "5") {
    abort
  }

abort в VRL останавливает обработку события — оно не дойдёт до sink.

Парсить JSON из поля:

source: |
  .parsed = parse_json!(.message)
  .level = .parsed.level
  .msg = .parsed.msg

Отправка в Loki

Loki — система хранения логов от Grafana. Принимает лейблы для индексации:

sinks:
  loki:
    type: loki
    inputs:
      - parse_nginx
    endpoint: http://localhost:3100
    labels:
      app: nginx
      env: production
      host: "{{ hostname }}"
    encoding:
      codec: json

Лейблы — ключ к производительности Loki. Их должно быть мало (3–5) и с низкой кардинальностью. Не делайте лейблом IP-адрес или user-agent — это создаст миллионы потоков.

Отправка в Elasticsearch

sinks:
  elasticsearch:
    type: elasticsearch
    inputs:
      - parse_nginx
    endpoints:
      - http://localhost:9200
    index: nginx-logs-%Y.%m.%d
    auth:
      strategy: basic
      user: elastic
      password: "${ES_PASSWORD}"

Переменные окружения через ${} — пароли не хранятся в конфиге в открытом виде.

Маршрутизация: разные логи в разные места

Один источник, несколько направлений в зависимости от содержимого — через route transform:

sources:
  all_logs:
    type: file
    include:
      - /var/log/myapp/app.log

transforms:
  router:
    type: route
    inputs:
      - all_logs
    route:
      errors: '.level == "error" || .level == "critical"'
      info: '.level == "info" || .level == "debug"'

sinks:
  errors_to_loki:
    type: loki
    inputs:
      - router.errors
    endpoint: http://localhost:3100
    labels:
      severity: error

  info_to_file:
    type: file
    inputs:
      - router.info
    path: /var/log/vector/info-%Y-%m-%d.log
    encoding:
      codec: text

Ошибки идут в Loki для мониторинга, обычные логи — в файл для архива.

Агрегация метрик из логов

Vector умеет считать метрики прямо из логов и отдавать их в Prometheus:

transforms:
  count_errors:
    type: log_to_metric
    inputs:
      - parse_nginx
    metrics:
      - type: counter
        field: status
        name: nginx_requests_total
        tags:
          status: "{{ status }}"
          method: "{{ method }}"

sinks:
  prometheus:
    type: prometheus_exporter
    inputs:
      - count_errors
    address: 0.0.0.0:9598

Prometheus scrapes http://server:9598/metrics и получает nginx_requests_total по статусам и методам — без отдельного nginx-exporter.

Дебаг: проверить что идёт через пайплайн

Вывести события в stdout во время разработки конфига:

sinks:
  debug:
    type: console
    inputs:
      - parse_nginx
    encoding:
      codec: json

Запустить с конкретным конфигом и смотреть вывод:

vector --config /etc/vector/vector.yaml

Встроенный tap — смотреть живой поток событий через конкретный компонент:

vector tap parse_nginx

Сравнение с Logstash и Fluentd

Параметр Vector Logstash Fluentd
Язык Rust Java Ruby
RAM при запуске ~20–50 МБ ~500–800 МБ ~50–100 МБ
CPU на простое минимальный высокий низкий
Язык трансформаций VRL Grok + Ruby Fluent DSL
Производительность очень высокая средняя высокая
Поддержка sources широкая широкая широкая
Метрики из логов встроено плагин плагин

На VPS с ограниченными ресурсами Vector — очевидный выбор. На крупных инсталляциях где уже настроен Logstash — переходить не обязательно.

Шпаргалка

Задача Команда / конфиг
Установить sudo apt install vector
Валидировать конфиг vector validate /etc/vector/vector.yaml
Смотреть живой поток vector tap имя_компонента
Источник — файл type: file + include:
Источник — journald type: journald + include_units:
Парсинг Nginx parse_nginx_log!(string!(.message), "combined")
Фильтр в VRL if условие { abort }
Маршрутизация type: route + именованные маршруты
Метрики из логов type: log_to_metric
Prometheus exporter type: prometheus_exporter

 

Поделиться статьей

Похожие статьи