VictoriaLogs 查询

夜莺( Nightingale )VictoriaLogs 日志告警规则

VictoriaLogs 日志告警通过 LogsQL 进行日志统计分析,及时发现异常并触发告警。

配置说明

查询统计

查询条件

在查询条件输入框中输入 LogsQL 统计查询语句,查询结果会赋值给变量 $A。

查询语句格式:<过滤条件> | stats <统计函数>

点击「数据预览」按钮可以查看查询结果,验证查询语句是否正确。

阈值判断

基于查询统计的结果设置告警阈值,例如 $A > 10 表示统计值大于 10 时触发告警。

请确保所有变量均有数据,且它们的标签一致,否则无法进行阈值判断。

数据缺失

配置当查询无数据时的处理策略。

LogsQL 查询语法

过滤条件

关键字查询

error                           # 查询包含 "error" 的日志
"connection timeout"            # 查询包含完整短语的日志

字段过滤

_stream:{host="server1"}        # 匹配 stream 标签
level:=error                    # 精确匹配字段值
level:error                     # 字段包含某值
status:>=500                    # 数值比较

逻辑运算符

error AND timeout               # 同时包含
error OR warning                # 包含任一
error NOT debug                 # 排除

通配符和正则

err*                            # 前缀匹配
/error|warning/i                # 正则匹配(i 表示忽略大小写)

时间过滤

使用 _time 字段筛选时间范围,这在告警场景中非常常用:

_time:1m                        # 最近 1 分钟
_time:5m                        # 最近 5 分钟
_time:10m                       # 最近 10 分钟
_time:30m                       # 最近 30 分钟
_time:1h                        # 最近 1 小时
_time:1d                        # 最近 1 天

时间范围查询:

_time:[now-5m, now]             # 最近 5 分钟(等同于 _time:5m)
_time:[2024-01-01, 2024-01-02]  # 指定日期范围
_time:["2024-01-01 10:00", "2024-01-01 12:00"]  # 指定时间范围

组合使用示例:

_time:5m AND level:=error       # 最近 5 分钟的错误日志
_time:10m AND status:>=500      # 最近 10 分钟的 5xx 错误

统计管道(stats)

查询语句必须使用 | stats 管道进行统计,常用统计函数:

函数 说明 示例
count() 统计日志数量 stats count() as total
count_uniq(field) 统计字段唯一值数量 stats count_uniq(user_id) as users
sum(field) 求和 stats sum(bytes) as total_bytes
avg(field) 平均值 stats avg(response_time) as avg_rt
min(field) 最小值 stats min(latency) as min_latency
max(field) 最大值 stats max(latency) as max_latency

分组统计(by)

使用 by (field) 按字段分组,分组后每个分组会独立产生告警:

error | stats by (host) count() as count

详细的 LogsQL 语法请参考 VictoriaLogs 官方文档

使用样例

示例1:错误日志数量监控(5分钟)

查询条件:

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

阈值判断: $A > 10

示例2:按主机分组监控错误(5分钟)

查询条件:

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

阈值判断: $A > 50

每个主机独立告警。

示例3:5xx 状态码监控(10分钟)

查询条件:

_time:10m AND status:>=500 AND status:<600 | stats count() as count

阈值判断: $A > 100

示例4:按服务和状态码分组统计(10分钟)

查询条件:

_time:10m AND status:>=400 | stats by (service, status) count() as count

阈值判断: $A > 50

示例5:平均响应时间监控(5分钟)

查询条件:

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

阈值判断: $A > 1000

示例6:关键字告警(10分钟)

查询条件:

_time:10m AND ("timeout" OR "connection refused" OR "out of memory") | stats count() as count

阈值判断: $A > 5

示例7:正则表达式匹配(5分钟)

查询条件:

_time:5m AND /exception|panic|fatal/i AND _stream:{env="production"} | stats by (service) count() as count

阈值判断: $A > 20

示例8:唯一用户数监控(30分钟)

查询条件:

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

阈值判断: $A > 100

常见问题

Q1:VictoriaLogs 查询语法和 LogQL/ES 一样吗?

A:VictoriaLogs 用自家的 LogsQL 语法和 LogQL(Loki)、ES Query DSL 都不同。常见模式:

  • _msg:error — 全文搜含 error 的日志;
  • level:ERROR _msg:timeout — 多条件 AND;
  • app:nginx | stats count() — 按字段聚合。

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

A:是。告警引擎按周期跑同样的 LogsQL,统计返回行数(或聚合结果)作为告警判定依据。在 日志查询 页面先验证查询能返回结果,再去配告警。

Q3:告警阈值怎么写?

A:常见模式:

  • 日志条数告警:LogsQL 用 _msg:ERROR 简单查询,阈值用 $A.count > 10
  • 特定字段值告警:用 | stats by(app) count() 聚合后判定某 app 的错误数。

Q4:跟 ES / Loki 比 VictoriaLogs 优势?

A:

  • 存储成本低(压缩比好);
  • 查询性能在大数据量场景显著优于 ES(VictoriaMetrics 团队优化的列存);
  • 跟 VictoriaMetrics 同一套运维栈,量级大的场景一站式。

参考资料

更新时间 2025-03-13

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