VictoriaLogs:轻量级日志存储方案,Loki 的高效替代

VictoriaLogs:轻量级日志存储方案,Loki 的高效替代

日志存储是可观测性体系的重要一环。Elasticsearch 功能强大但资源消耗惊人,Loki 虽然轻量但配置复杂、查询能力有限。VictoriaLogs 是 VictoriaMetrics 团队推出的高性能日志存储方案,以极低的资源占用提供出色的摄入性能和原生 LogsQL 查询能力,是中小规模日志场景的理想选择。


目录

  1. VictoriaLogs 核心优势
  2. 服务器配置
  3. Docker Compose 快速部署
  4. Fluent Bit 日志采集配置
  5. LogsQL 查询语言入门
  6. Grafana 接入 VictoriaLogs
  7. 高级查询:过滤、聚合与统计
  8. 保留策略配置
  9. 与 Loki 对比分析
  10. 生产部署建议

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 中:

  1. 进入 Administration → Plugins
  2. 搜索 VictoriaLogs
  3. 安装插件并重启 Grafana

配置数据源

  1. 进入 Configuration → Data Sources → Add data source
  2. 选择 VictoriaLogs
  3. URL 填写:http://victorialogs:9428
  4. 点击 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 抓取配置即可监控摄入速率、存储大小等关键指标。

相关推荐
Avan_菜菜12 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工7 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智7 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_7 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化