Vector — wydajny pipeline do agregacji logów na VPS
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS
Logstash pożera GB RAMu, Fluentd jest wolny pod obciążeniem — Vector to alternatywa napisana w Rust, która przetwarza miliony zdarzeń na sekundę przy minimalnym zużyciu zasobów. Jeden agent zbiera logi, metryki i traces, transformuje je przez VRL i rozsyła do wielu sinków. Oto kompletny przewodnik.
Instalacja Vector
# Ubuntu/Debian — oficjalny pakiet curl -1sLf 'https://repositories.timber.io/public/vector/cfg/setup/bash.deb.sh' | bash apt install vector # Weryfikacja vector --version systemctl status vector # Konfiguracja domyślna cat /etc/vector/vector.toml
Podstawowa konfiguracja — TOML
Plik /etc/vector/vector.toml. Każdy komponent ma typ (type) i
opcjonalne inputs wskazujące na poprzednie komponenty:
# /etc/vector/vector.toml
# 1. SOURCE — czytaj logi Nginx
[sources.nginx_logs]
type = "file"
include = ["/var/log/nginx/access.log", "/var/log/nginx/error.log"]
read_from = "end"
multiline.condition_pattern = '^[0-9]'
multiline.mode = "halt_before"
multiline.start_pattern = '^[0-9]'
multiline.timeout_ms = 1000
# 2. TRANSFORM — parsuj format access.log
[transforms.parse_nginx]
type = "remap"
inputs = ["nginx_logs"]
source = '''
# Parsuj Combined Log Format
. = parse_common_log!(.message)
.host = get_hostname!()
.service = "nginx"
'''
# 3. TRANSFORM — filtruj healthchecks
[transforms.filter_health]
type = "filter"
inputs = ["parse_nginx"]
condition = '.request != "GET /health HTTP/1.1"'
# 4. SINK — wyślij do Loki
[sinks.loki_out]
type = "loki"
inputs = ["filter_health"]
endpoint = "http://loki:3100"
encoding.codec = "json"
[sinks.loki_out.labels]
host = "{{ host }}"
service = "{{ service }}"
level = "{{ level }}" Zbieranie logów Dockera
[sources.docker]
type = "docker_logs"
docker_host = "unix:///var/run/docker.sock"
# Opcjonalnie filtruj kontenery:
# include_labels = ["com.docker.compose.project=myapp"]
# exclude_containers = ["vector"]
[transforms.enrich_docker]
type = "remap"
inputs = ["docker"]
source = '''
# Metadane kontenera są automatycznie w zdarzeniu
.host = get_hostname!()
# Spróbuj sparsować JSON w message
parsed, err = parse_json(.message)
if err == null {
. = merge(., parsed)
}
'''
[sinks.loki_docker]
type = "loki"
inputs = ["enrich_docker"]
endpoint = "http://loki:3100"
encoding.codec = "json"
[sinks.loki_docker.labels]
host = "{{ host }}"
container = "{{ container_name }}"
image = "{{ image }}" VRL — Vector Remap Language
VRL to domenowy język do transformacji zdarzeń. Przykłady najczęściej używanych operacji:
# VRL — przykłady transformacji
# Parsowanie JSON
.parsed = parse_json!(.message)
# Parsowanie logu Apache/Nginx combined format
. = parse_common_log!(.message)
# Ekstrakcja regex — wyciągnij ID z URL
.user_id = parse_regex!(.path, r'/users/(?P<id>\d+)').id
# Ustawianie poziomu logu na podstawie status_code
.level = if .status >= 500 {
"error"
} else if .status >= 400 {
"warn"
} else {
"info"
}
# Usuwanie pola (prywatne dane)
del(.user_email)
# Zmiana nazwy pola
.duration_ms = del(.response_time)
# Dodanie timestampa jeśli brak
if !exists(.timestamp) {
.timestamp = now()
} Multi-output — Loki + S3 + Elasticsearch
Vector obsługuje wiele sinków jednocześnie — możesz wysyłać te same logi do wielu miejsc:
# Wyślij do Loki (hot storage — ostatnie 7 dni)
[sinks.loki]
type = "loki"
inputs = ["parse_nginx"]
endpoint = "http://loki:3100"
encoding.codec = "json"
[sinks.loki.labels]
host = "{{ host }}"
service = "nginx"
# Archiwum w S3 (cold storage — długoterminowe)
[sinks.s3_archive]
type = "aws_s3"
inputs = ["parse_nginx"]
bucket = "logs-archive"
region = "eu-central-1"
key_prefix = "nginx/%Y/%m/%d/"
encoding.codec = "ndjson"
compression = "gzip"
batch.max_bytes = 10000000 # 10 MB per plik Benchmarki — Vector vs Logstash vs Fluentd
| Metrika | Vector | Logstash | Fluentd |
|---|---|---|---|
| Przepustowość (events/s) | ~5 000 000 | ~100 000 | ~800 000 |
| RAM (idle) | ~20 MB | ~512 MB (JVM) | ~50 MB |
| CPU (pod obciążeniem) | Najniższe | Najwyższe | Średnie |
| Język implementacji | Rust | Java/JRuby | Ruby/C |
| Latency przy przetwarzaniu | <1ms | 10-100ms | 5-50ms |
Uwaga: Benchmarki mogą różnić się w zależności od środowiska i konfiguracji. Vector jest szczególnie wydajny przy prostych transformacjach. Logstash ma bogatszy ekosystem pluginów (np. dla Beats).
Testowanie i walidacja konfiguracji
# Waliduj konfigurację bez uruchamiania vector validate /etc/vector/vector.toml # Testuj pipeline na przykładowych danych echo '127.0.0.1 - - [10/Apr/2026:10:00:00 +0200] "GET /api HTTP/1.1" 200 1234' | \ vector --config /etc/vector/vector.toml # Podgląd zdarzeń w czasie rzeczywistym (tap) vector tap --outputs parse_nginx # Statystyki wewnętrzne vector top