ES 查询

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

ES 日志告警

ES 日志告警可以通过对日志进行查询分析,来及时发现异常日志,并触发告警。

首先可以选择ES数据源,然后配置查询条件和告警条件,下面针对每个数字指向的功能,进行下详细说明

1 选择索引

支持多种配置方式

  1. 指定单个索引 gb 在 gb 索引中搜索所有的文档
  2. 指定多个索引 gb,us 在 gb 和 us 索引中搜索所有的文档
  3. 指定索引前缀 g*,u* 在任何以 g 或者 u 开头的索引中搜索所有的文档

2 设置过滤条件

目前支持的是 query string 语法(Lucene 语法)

基础查询语法
语法 说明 示例
字段:值 查询字段包含指定值的记录 status:active
字段:(值1 OR 值2) 查询字段包含任意一个值的记录 title:(quick OR brown)
字段:"完整短语" 查询字段包含完整短语的记录(不分词) author:"John Smith"
关于分词的重要说明

Elasticsearch 对 text 类型字段会进行分词处理,这是最容易踩坑的地方:

什么是分词?

  • 当字段类型为 text 时,ES 会将内容拆分成多个词(token)建立索引
  • 中文分词器会将"连接超时"拆分为"连接"、“超时"等词
  • 英文会按空格和标点拆分,“John Smith"会拆分为"john"和"smith”

分词对查询的影响:

查询方式 行为 是否会被分词
message:连接超时 查询词也会被分词,默认 OR 逻辑匹配 ✅ 会分词
message:"连接超时" 短语查询,要求完整短语按顺序出现 ❌ 不分词
message.keyword:连接超时 使用 keyword 子字段,精确匹配 ❌ 不分词

常见问题:查询结果中没有搜索的关键字

如果你搜索 message:连接超时,但返回的日志中并没有"连接超时"这个词,原因是:

  1. 查询词"连接超时"被分词成了"连接”、“超时”
  2. ES 默认使用 OR 逻辑,只要文档包含其中任意一个词就会返回
  3. 所以只包含"连接"或"超时"的日志也会被查询出来

解决方案:

# 方案1:使用引号进行短语查询(推荐)
message:"连接超时"

# 方案2:使用 AND 强制所有词都必须存在
message:(连接 AND 超时)

# 方案3:使用 keyword 子字段精确匹配(需索引支持)
message.keyword:*连接超时*

支持使用 ? 和 * 通配符:

- qu?ck - ? 匹配单个字符
- bro* - * 匹配零个或多个字符

使用 ~ 运算符进行模糊匹配:

- quikc~ - 匹配与 quick 相似的词
- "fox quick"~5 - 短语查询中的词之间可以相隔最多5个位置

支持数值和日期范围:

- count:[1 TO 5] - 闭区间,包含1和5
- date:[2022-01-01 TO 2022-12-31]
- age:>=10 - 大于等于10

可以使用 AND、OR、NOT 等布尔操作符:

- quick AND brown - 同时包含两个词
- quick OR brown - 包含其中任意一个词
- quick NOT fox - 包含 quick 但不包含 fox

详细的语法可以参考 ES 文档

3 设置日期字段

点击可以选择日志中的日期字段,通过此字段来作为查询日志的时间范围的依据

4 设置查询日志的时间范围

如果是 5 分钟,表示在做告警查询时,会查询过去 5 分钟内的日志

5 数值提取

对日志进行统计分析的函数,比如 count、sum、avg、min、max 等

6 Group By

对日志进行分组,比如按照 host 字段进行分组,进行 count 统计, 查询到的结果会按照 host 字段进行分组

7 告警条件

统计分析得到的数值,会赋值给 告警条件中的 A、B、C 等变量,然后根据这些变量进行告警条件判断,比如 $A > 10 表示日志数量大于10条时触发告警

8 高级配置

在有的场景,日志会出现延迟,如果延迟3 分钟,查询最近 3 分钟的数据,会查不到数据,这时,可以在高级配置中,设置延迟查询时间,比如延迟 180s,表示查询查询的时候,把开始时间和终止时间都向前偏移 180s

使用样例

示例1:错误日志监控

  • 索引:app-logs-*
  • 查询条件:level:ERROR AND service:payment
  • 时间范围:5分钟
  • 数值提取:count()
  • 告警条件:$A > 10 说明:监控支付服务在5分钟内的错误日志数量是否超过10条

示例2:接口响应时间监控

  • 索引:nginx-access-*
  • 查询条件:path:"/api/v1/order*" AND response_time:>500
  • 时间范围:10分钟
  • 数值提取:avg(response_time)
  • Group By:path
  • 告警条件:$A > 1000 说明:监控订单相关接口的平均响应时间是否超过1秒

示例3:异常状态码监控

  • 索引:nginx-*
  • 查询条件:status:[500 TO 599]
  • 时间范围:15分钟
  • 数值提取:count()
  • Group By:host, status
  • 告警条件:$A > 50 说明:按主机和状态码分组统计5xx错误,如果某台主机的某个状态码出现次数超过50次则告警

示例4:业务异常关键字监控

  • 索引:business-logs-*
  • 查询条件:message:(“timeout” OR “connection refused” OR “out of memory”)
  • 时间范围:30分钟
  • 数值提取:count()
  • 告警条件:$A > 5 说明:监控包含特定错误关键字的日志数量

更新时间 2025-03-13

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