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 抓取配置即可监控摄入速率、存储大小等关键指标。

相关推荐
枳实-叶1 小时前
【Linux驱动开发】第18天:I2C驱动深度解析
linux·运维·驱动开发
shandianchengzi1 小时前
【记录】Ubuntu|Ubuntu 26.04 笔记本耗电过快,排查 省电过程
linux·运维·ubuntu
一叶星殇1 小时前
日志成海,何以检索:Serilog 解锁 .NET 日志可查询新范式
运维·服务器
企服AI产品测评局1 小时前
AI Agent实测:Agent Store现成应用如何重塑企业自动化?
运维·人工智能·ai·chatgpt·自动化
上海云盾安全满满1 小时前
服务器不稳定,丢包有哪些原因?
运维·服务器
陳10301 小时前
Linux:信号
linux·运维·服务器
tongluowan0071 小时前
负载均衡之硬件与软件层面的异同
运维·nginx·负载均衡·f5
小此方1 小时前
Re:Linux系统篇(二十五)进程篇·十:深度硬核!Linux 进程等待,从 task_struct 源码到位图状态解构
linux·运维·驱动开发
会Tk矩阵群控的小木2 小时前
企业级iMessage群发系统实战:单主机管控多iPhone设备完整实现
运维·ios·开源软件·个人开发