如何用Loki和Grafana实现全文搜索及日志缺失语句告警?
Loki + Grafana 全文搜索与日志告警实现方案
一、Loki + Grafana 全文搜索实现
LogQL支持标签过滤与全文检索结合,针对你的场景,常用语法如下:
- 精确匹配单个关键词:先筛选流标签,再搜索指定内容
该查询会返回{job="my_job"} |= "simulate from"job="my_job"所有流中包含"simulate from"的日志行。 - 多关键词逻辑与匹配:同时匹配多个关键词
{job="my_job"} |= "simulate from" |= "error=0" - 正则模糊匹配:用
~=匹配符合正则的内容{job="my_job", filename=~"20230920_.*.log"} ~= "error=[0-9]+" - 排除指定关键词:用
!=过滤包含目标内容的日志{job="my_job"} != "error=1"
在Grafana中,将上述查询输入Loki数据源的查询面板,即可实时查看匹配日志,完成全文搜索。
二、日志告警配置(检查文件是否包含指定语句)
你的需求是每天17点检查当日16点生成的日志文件,确保每个文件同时包含"simulate from"和"error=0",缺失则告警。具体实现步骤如下:
1. 编写LogQL查询语句
按filename分组统计每个文件中两个关键词的出现次数,筛选出任意关键词未出现的文件:
sum by (filename) ( count_over_time({job="my_job", filename=~"${__date:YYYYMMDD}_.*.log"} |= "simulate from" [1d]) + count_over_time({job="my_job", filename=~"${__date:YYYYMMDD}_.*.log"} |= "error=0" [1d]) ) < 2
${__date:YYYYMMDD}是Grafana内置变量,自动获取当天日期,确保只查询当日生成的日志文件count_over_time([1d])统计1天内匹配关键词的日志行数sum by (filename)将两个关键词的计数按文件聚合:若两个关键词都存在,总和至少为2;若任意一个缺失,总和会小于2,触发告警条件
2. 配置Grafana告警规则
- 进入Grafana的Alerting面板,点击Create alert rule
- 选择Loki作为数据源,粘贴上述查询语句
- 设置Evaluation behavior:
- 评估频率:用Cron表达式设置为
0 17 * * *(每天17点执行一次) - 时间范围:保持默认或设置为
1d,确保覆盖当日日志
- 评估频率:用Cron表达式设置为
- 设置告警阈值:当查询结果存在(即有文件满足
sum < 2)时触发告警 - 配置通知渠道:添加邮件、企业微信等通知方式,接收告警信息
注意事项
- 确保Loki已正确采集对应日志文件,流标签
job和filename配置准确 - 若日志文件生成存在延迟,可适当调整告警评估时间(比如17:10),避免因采集延迟导致误告警
三、替代工具建议
如果Loki的聚合能力无法满足你的复杂场景,可考虑以下工具:
- VictoriaMetrics Logs:与Prometheus生态兼容,存储效率更高,支持类似LogQL的查询语法,同时提供更灵活的聚合分析能力,适合大规模日志场景
- ELK Stack:Elasticsearch作为全文搜索数据库,可将每个日志文件作为独立文档分组,通过布尔查询直接检查文档是否包含指定关键词,配置更直观,适合对日志内容做精细化检索与告警的场景
内容的提问来源于stack exchange,提问作者54vault
相关产品推荐
相关产品推荐

