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 timeout、error OR warning、error 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 同一套运维栈——量级大的日志场景可以一站式。