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 |