VictoriaLogs 查询

从实际使用场景出发,介绍夜莺 VictoriaLogs 日志告警:用 LogsQL 的过滤 + stats 管道统计日志,配置告警阈值与分组告警。

概述

VictoriaLogs 日志告警用 LogsQL 对日志做统计分析,及时发现异常。它的模式是一条 LogsQL 语句:先过滤日志,再用 | stats 管道压成一个统计值,这个值赋给 $A,最后判阈值。

字段 必填 说明
数据源类型 / 数据源 VictoriaLogs 类型并选中已接入的实例
查询条件 LogsQL 语句,格式 <过滤条件> | stats <统计函数>,结果赋给 $A
告警条件 基于统计值判阈值,如 $A > 10
数据缺失 查询无数据时的处理策略

写完查询点「数据预览」验证语句正确、能返回统计值,再配阈值。

阈值判断要求所有变量都有数据、且标签一致,否则无法比较。

下面按实际使用场景介绍。

场景一:错误日志数量告警

统计一段时间内的错误日志条数。「支付服务 5 分钟内错误日志超过 10 条」:

查询条件:

_time:5m AND level:=error AND _stream:{service="payment"} | stats count() as count

告警条件: $A > 10

场景二:按维度分组告警

by (字段) 分组,每个分组独立产生告警。「按主机统计错误日志,某台机器超过 50 条就告警」:

查询条件:

_time:5m AND level:=error | stats by (host) count() as count

告警条件: $A > 50

每台主机独立判定,事件标签带对应的 host

场景三:统计类告警(响应时间、唯一值)

统计函数不止 count,还能算平均值、唯一值等。「API 网关 5 分钟内平均响应时间超过 1 秒」:

_time:5m AND _stream:{app="api-gateway"} | stats avg(response_time) as avg_rt

告警条件: $A > 1000

「30 分钟内出错的唯一用户数超过 100」:

_time:30m AND level:=error | stats count_uniq(user_id) as affected_users

告警条件: $A > 100

LogsQL 语法速查

过滤条件

用途 写法
关键字 error"connection timeout"(完整短语)
字段匹配 level:=error(精确)、level:error(包含)、status:>=500(数值)
stream 标签 _stream:{host="server1"}
逻辑组合 error AND timeouterror OR warningerror NOT debug
通配/正则 err*/error|warning/i
时间范围 _time:5m_time:1h_time:[now-5m, now]

统计管道(stats)

查询必须用 | stats 管道统计,常用函数:count()count_uniq(field)sum(field)avg(field)min(field)max(field)。用 by (field) 分组,分组后每组独立告警。

完整 LogsQL 语法见 VictoriaLogs 官方文档

常见问题

Q1:VictoriaLogs 的语法和 LogQL(Loki)/ES 一样吗?

A:不一样。VictoriaLogs 用自家的 LogsQL,与 Loki 的 LogQL、ES 的 query DSL 都不同。核心区别是必须用 | stats 管道显式做统计。

Q2:告警查询和日志查询是同一份数据吗?

A:是。告警引擎按周期跑同样的 LogsQL。建议先在日志查询页面验证查询能返回结果,再去配告警。

Q3:告警阈值基于什么判定?

A:基于 | stats 统计出来的值。简单计数用 count() as count$A > 10;分组统计用 by (app) count() 后判定各分组。

Q4:相比 ES / Loki 有什么优势?

A:存储成本低(压缩比好)、大数据量查询性能强、和 VictoriaMetrics 同一套运维栈——量级大的日志场景可以一站式。

参考资料

更新时间 2026-07-17

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云