Install (single-binary)
VL_VER=v1.10.0
curl -L "https://github.com/VictoriaMetrics/VictoriaLogs/releases/download/${VL_VER}/victoria-logs-linux-amd64-${VL_VER}.tar.gz" \
| tar -xz
sudo install victoria-logs-prod /usr/local/bin/victoria-logs
# Run
sudo mkdir /var/lib/victoria-logs
sudo /usr/local/bin/victoria-logs \
-storageDataPath=/var/lib/victoria-logs \
-retentionPeriod=180d \
-httpListenAddr=:9428
Or via Docker:
docker run -d --name vlogs \
-p 127.0.0.1:9428:9428 \
-v vlogs-data:/victoria-logs-data \
victoriametrics/victoria-logs:latest \
-storageDataPath=/victoria-logs-data \
-retentionPeriod=90d
The ingestion protocols (lots of them)
VictoriaLogs accepts logs via many protocols:
- Loki protocol — clients that push to Loki (Promtail, Grafana Alloy) work unchanged at
/insert/loki/api/v1/push - OpenTelemetry OTLP —
/insert/opentelemetry/v1/logsfor OTLP HTTP, plus gRPC on a separate port - Elasticsearch bulk —
/insert/elasticsearch/_bulk; ship from Filebeat / Logstash / Vector with the Elasticsearch sink unchanged - JSON Lines — raw
/insert/jsonline - syslog —
-syslog.listenAddrfor RFC5424 / RFC3164 - journald — via Fluent Bit or Vector's journald source
Practical: keep your existing log shipper; redirect to VictoriaLogs; query the new way.
The first ingest
# Drop a JSON line directly via curl
echo '{"_msg":"hello world","level":"info","app":"demo","_time":"2026-05-22T15:00:00Z"}' \
| curl -X POST -H 'Content-Type: application/stream+json' \
--data-binary @- \
"http://localhost:9428/insert/jsonline?_stream_fields=app,level"
The _stream_fields query param tells VictoriaLogs which fields define a stream (think label cardinality from Loki). All other fields are indexed but not stream-cardinality.
Query with LogsQL
# Free-text
curl 'http://localhost:9428/select/logsql/query' --data-urlencode 'query=error'
# Filter by stream label
curl 'http://localhost:9428/select/logsql/query' --data-urlencode 'query={app="nginx"}'
# Combine: nginx logs with status 500 in the last hour
curl 'http://localhost:9428/select/logsql/query' \
--data-urlencode 'query={app="nginx"} status:500' \
--data-urlencode 'start=1h'
# Extract structured fields from unstructured logs
curl 'http://localhost:9428/select/logsql/query' \
--data-urlencode 'query={app="api"} | extract "level=<level> path=<path>"'
# Stats
curl 'http://localhost:9428/select/logsql/query' \
--data-urlencode 'query={app="nginx"} | stats by(status) count()'
LogsQL is more expressive than LogQL (Loki's query language) for free-form structured logs — the | extract + | stats + | top pipeline operators feel like a real query language, not "grep with extras."
Grafana integration
In Grafana → Data Sources → "VictoriaLogs" (the Grafana plugin). URL http://victorialogs:9428. Now Explore + dashboards can query LogsQL alongside Prometheus / Loki / Tempo.
For Loki-API compatibility: VictoriaLogs also serves the Loki API endpoints, so existing Loki dashboards in Grafana keep working if you redirect them to http://victorialogs:9428 as a Loki data source.
The shipping pattern with Vector
# vector.toml
[sources.journald]
type = "journald"
[sources.docker]
type = "docker_logs"
[transforms.parse]
type = "remap"
inputs = ["journald", "docker"]
source = '''
.level = .PRIORITY
.container = .container_name
'''
[sinks.victorialogs]
type = "elasticsearch"
inputs = ["parse"]
endpoints = ["http://victorialogs:9428/insert/elasticsearch/"]
bulk.index = "%Y-%m-%d"
mode = "bulk"
Vector reads journald + Docker logs; tags them; ships to VictoriaLogs over the Elasticsearch bulk protocol.
Performance compared to alternatives
Per the VictoriaLogs benchmarks (published independently; verify yours):
- ~10x smaller disk usage vs Elasticsearch on the same data
- ~3-5x smaller vs Loki
- ~10x faster query on full-text search vs Loki at moderate cardinality
- Lower memory ceiling than Elasticsearch on the same retention period
The trade-off: smaller community + ecosystem than Loki + Elasticsearch in 2026. Tooling like Grafana works; less third-party integration than Elasticsearch.
Cluster mode
Like VictoriaMetrics, VictoriaLogs has a cluster mode for petabyte-scale (separate vlinsert / vlselect / vlstorage components). For most homelab + mid-fleet, single-binary mode is plenty.
What VictoriaLogs isn't
- Not a full-text search engine like Elasticsearch is for non-log data — for ecommerce / docs search, MeiliSearch (see that tutorial) is purpose-built.
- Not a metrics database — for time-series, use VictoriaMetrics or Prometheus.
- Not a complete observability stack alone — pair with VictoriaMetrics + Grafana + (optionally) Tempo (see that tutorial) for metrics + logs + traces.
When VictoriaLogs is the right pick
- Self-hosted observability where disk usage matters (single-host, small clusters, edge).
- You already use VictoriaMetrics and want the same operational shape for logs.
- You like LogsQL's structured-query approach over Loki's regex-and-streams model.
When Loki is still the right pick
- You're already in the Grafana ecosystem deeply; Loki is the canonical fit.
- You need the largest community + first-party Grafana integration.
- You're committed to Loki's labels-and-streams pattern.