VictoriaLogs:轻量级日志存储方案,Loki 的高效替代
日志存储是可观测性体系的重要一环。Elasticsearch 功能强大但资源消耗惊人,Loki 虽然轻量但配置复杂、查询能力有限。VictoriaLogs 是 VictoriaMetrics 团队推出的高性能日志存储方案,以极低的资源占用提供出色的摄入性能和原生 LogsQL 查询能力,是中小规模日志场景的理想选择。
目录
- VictoriaLogs 核心优势
- 服务器配置
- Docker Compose 快速部署
- Fluent Bit 日志采集配置
- LogsQL 查询语言入门
- Grafana 接入 VictoriaLogs
- 高级查询:过滤、聚合与统计
- 保留策略配置
- 与 Loki 对比分析
- 生产部署建议
VictoriaLogs 核心优势
VictoriaLogs 在以下方面明显优于同类产品:
- 内存占用极低:相同数据量下,内存用量仅为 Elasticsearch 的 1/10
- 存储压缩率高:比 Loki 压缩率更好,节省磁盘空间
- 摄入性能强:单实例可处理百万级 log/s
- 配置简单:单二进制文件,无需 Zookeeper/etcd 等外部依赖
- 多协议摄入:支持 syslog、Elasticsearch JSON bulk、JSON lines、OpenTelemetry
- 原生 LogsQL:类似 PromQL 的强类型查询语言
服务器配置
VictoriaLogs 资源占用非常低,入门配置即可运行:
- 服务器规格:2 核 4GB 内存(远低于 Loki 的推荐 8GB)
- 存储:根据日志量决定,SSD 优先
- 操作系统:Ubuntu 22.04 LTS
推荐使用 雨云服务器 rainyun-com ,注册填 2026off 领 5 折,2 核 4GB 机型即可流畅运行 VictoriaLogs 加完整日志采集栈,比同等配置的 Loki 部署节省一半内存。
Docker Compose 快速部署
完整 docker-compose.yml
yaml
version: "3.8"
services:
victorialogs:
image: victoriametrics/victoria-logs:latest
container_name: victorialogs
command:
- "--storageDataPath=/vlogs-data"
- "--retentionPeriod=30d"
- "--httpListenAddr=:9428"
ports:
- "9428:9428"
volumes:
- vlogs_data:/vlogs-data
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: admin123
volumes:
- grafana_data:/var/lib/grafana
restart: unless-stopped
fluent-bit:
image: fluent/fluent-bit:latest
container_name: fluent-bit
volumes:
- ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/log:/var/log:ro
depends_on:
- victorialogs
restart: unless-stopped
volumes:
vlogs_data:
grafana_data:
bash
docker compose up -d
VictoriaLogs 默认监听 9428 端口。
Fluent Bit 日志采集配置
fluent-bit.conf
ini
[SERVICE]
Flush 5
Daemon Off
Log_Level info
Parsers_File parsers.conf
[INPUT]
Name tail
Path /var/lib/docker/containers/*/*.log
Parser docker
Tag docker.*
Refresh_Interval 5
Mem_Buf_Limit 5MB
Skip_Long_Lines On
[INPUT]
Name systemd
Tag host.*
Systemd_Filter _SYSTEMD_UNIT=nginx.service
Read_From_Tail On
[FILTER]
Name record_modifier
Match docker.*
Record hostname ${HOSTNAME}
Record source docker
[FILTER]
Name record_modifier
Match host.*
Record hostname ${HOSTNAME}
Record source systemd
[OUTPUT]
Name http
Match *
Host victorialogs
Port 9428
URI /insert/jsonline?_stream_fields=hostname,source,container_name&_msg_field=log&_time_field=time
Format json_lines
Json_Date_Key time
Json_Date_Format iso8601
Compress gzip
关键参数说明
_stream_fields:用于区分日志流的标签字段(类似 Loki 的 stream labels)_msg_field:日志消息字段名_time_field:时间戳字段名
Vector 配置替代方案
toml
# vector.toml
[sources.docker_logs]
type = "docker_logs"
include_containers = []
[transforms.add_fields]
type = "remap"
inputs = ["docker_logs"]
source = '''
.source = "docker"
.hostname = get_hostname!()
'''
[sinks.victorialogs]
type = "http"
inputs = ["add_fields"]
uri = "http://victorialogs:9428/insert/jsonline?_stream_fields=hostname,source&_msg_field=message&_time_field=timestamp"
encoding.codec = "json"
framing.method = "newline_delimited"
LogsQL 查询语言入门
LogsQL 是 VictoriaLogs 的原生查询语言,语法直观,功能强大。
基础查询
# 查询所有来自 nginx 容器的日志
_stream:{container_name="nginx"}
# 全文搜索(包含关键词)
error
# 组合查询:nginx 容器中的错误日志
_stream:{container_name="nginx"} error
管道操作符
LogsQL 支持类似 Unix 管道的查询方式:
# 解析 JSON 日志并过滤 5xx 状态码
_stream:{container_name="nginx"} | json | status_code:~"5.."
# 统计过去 1 小时的错误日志数量
_time:1h error | stats count() total
# 按容器名分组统计日志量
_time:5m | stats by (container_name) count() log_count
# 提取字段后过滤
_stream:{source="docker"} | json | level:="error" | stats count() errors
时间过滤
# 过去 15 分钟
_time:15m
# 今天
_time:today
# 指定时间范围(Unix 时间戳)
_time:[2026-05-18T00:00:00Z, 2026-05-18T23:59:59Z]
字段操作
# 提取 JSON 中的特定字段
_stream:{container_name="app"} | json | keep level, message, request_id
# 重命名字段
_stream:{container_name="app"} | json | rename status_code as http_status
# 条件过滤(精确匹配)
_stream:{container_name="app"} | json | level:="error" | message:~"database.*timeout"
Grafana 接入 VictoriaLogs
安装 VictoriaLogs 数据源插件
bash
grafana-cli plugins install victoriametrics-logs-datasource
或在 Grafana UI 中:
- 进入 Administration → Plugins
- 搜索 VictoriaLogs
- 安装插件并重启 Grafana
配置数据源
- 进入 Configuration → Data Sources → Add data source
- 选择 VictoriaLogs
- URL 填写:
http://victorialogs:9428 - 点击 Save & Test
也可以直接在 Grafana Explore 中使用原生 HTTP 接口查询:
http://victorialogs:9428/select/logsql/query?query=_stream:{container_name="nginx"}&start=now-1h&end=now
高级查询:过滤、聚合与统计
流标签过滤
流标签(stream labels)是 VictoriaLogs 的索引维度,过滤效率最高:
# 多条件流标签过滤
_stream:{hostname="prod-server-01", source="docker"}
# 正则匹配
_stream:{container_name=~"app.*"}
全文搜索
# 大小写不敏感搜索
i"OutOfMemory"
# 短语搜索
"connection refused"
# 多关键词(AND 语义)
error timeout database
统计聚合
# 按分钟统计错误数(时序聚合)
_time:1h error | stats by (_time:1m) count() errors_per_minute
# 计算 P99 响应时间(需要数值字段)
_stream:{container_name="api"} | json | stats quantile(0.99, response_time) p99_ms
# Top N 查询
_time:1h | stats by (container_name) count() logs | sort by (logs desc) | limit 10
保留策略配置
通过启动参数配置数据保留周期:
yaml
command:
- "--retentionPeriod=30d" # 保留 30 天
- "--storageDataPath=/vlogs-data"
支持的时间单位:h(小时)、d(天)、w(周)、y(年)。
VictoriaLogs 会自动清理过期数据,无需手动干预。
与 Loki 对比分析
| 特性 | VictoriaLogs | Loki |
|---|---|---|
| 最低内存需求 | 约 200MB | 约 1GB+ |
| 磁盘压缩率 | 极高 | 较高 |
| 查询语言 | LogsQL(功能丰富) | LogQL(相对简单) |
| 配置复杂度 | 低(单二进制) | 中(需配置 chunks/index) |
| 多租户支持 | 有限 | 完整 |
| 水平扩展 | 暂不支持(单实例) | 支持(microservices 模式) |
| Grafana 集成 | 插件支持 | 原生支持 |
| 生态成熟度 | 较新 | 成熟 |
选择建议:
- 单机或小集群、资源有限 → VictoriaLogs
- 大规模多租户、需要水平扩展 → Loki
- 需要全文检索和复杂聚合 → Elasticsearch
生产部署建议
数据持久化
确保 --storageDataPath 挂载到独立磁盘,避免系统盘写满:
bash
# 检查磁盘使用情况
du -sh /vlogs-data/
性能调优
对于高吞吐场景,可以调整以下参数:
--insert.maxQueueDuration=30s # 写入队列超时
--search.maxQueryDuration=30s # 查询超时
--search.maxConcurrentRequests=16 # 最大并发查询数
监控 VictoriaLogs 自身
VictoriaLogs 暴露 Prometheus 格式指标:
http://victorialogs:9428/metrics
将其加入 Prometheus 抓取配置即可监控摄入速率、存储大小等关键指标。