夜莺日志监控如何获取日志原文

本文解释夜莺开源版日志监控为什么默认只能基于 Elasticsearch 或 Loki 查询结果做数值告警,不能直接把日志原文放进告警事件,并给出附加查询、Flashduty 和自定义脚本 enrichment 三种实现思路。

作者 快猫运营团队

核心要点

  • 夜莺开源版日志告警的主查询目标是得到一个数值,再用阈值判断是否触发告警,因此默认拿不到完整日志原文。
  • 不建议把命中的所有日志行都塞进告警事件;更合理的方式是获取一条或少量样例日志,帮助值班人快速判断现场。
  • 如果工具支持附加查询,可以用主查询统计数量,用附加查询获取样例原文;如果不支持,可以在告警后通过脚本做 enrichment。
  • 日志原文进入告警前要注意脱敏、长度限制和上下文完整性,避免把告警消息变成新的噪音源。

夜莺支持指标监控和日志监控,其中日志监控主要是对接的 ElasticSearch 和 Loki,社区用的比较多的是 ElasticSearch,有不少朋友咨询,我在夜莺的日志监控中,怎么配置才能在告警事件中包含日志原文呢?

我们先看一下开源版夜莺的日志告警规则是如何配置的:

夜莺日志告警规则

首先选择类型为 ElasticSearch,然后选择具体针对哪个数据源做告警,然后就是配置查询统计条件,查询统计条件最终会查到一个数值,然后在「阈值判断」中对这个数值做阈值比对,如果超过阈值就触发告警。

这个查询统计条件,最终会转换成 ElasticSearch 的 DSL 发起查询,ElasticSearch 查完之后返回数值,注意,ElasticSearch 返回的仅仅是一个数值,而不是日志原文。所以夜莺侧是拿不到日志原文的。

查询类型 返回结果 适合用途
告警主查询 命中数量、聚合值等数值 判断是否超过阈值并触发告警
附加查询 一条或少量样例日志 给告警事件补充现场证据
人工下钻查询 完整时间范围内的原始日志 事故排查和根因定位

其实个人不建议在告警事件中包含日志原文,比如我想监控 Error 关键字,查询最近 5 分钟的日志,包含 Error 关键字的日志行有 1000 行,难道要把这 1000 行日志原文都塞到告警事件里吗?显然不现实。当然,有其他办法来做这个事情,但需要投入更多心智负担,开源版以简单实用为主,解决核心问题就可以了,所以就没有提供获取日志原文的功能。

如果就想要获取日志原文,可以参考 Flashduty 的方案。

Flashduty-告警规则

Flashduty 也是支持多种不同的数据源,其中就包括 ElasticSearch。日志原文的内容太多,Flashduty 建议只获取第一条样例日志,不要把日志全部塞到告警事件中。本质上,查询 ElasticSearch 「统计带有某个关键字的日志行数」和「获取包含某个关键字的第一条样例数据」是两个不同的查询请求,所以,一条规则中就要包含两个请求。相比开源夜莺,Flashduty 额外支持了一个附加查询功能,可以在附加查询中额外配置一个查询条件来获取日志原文。

即:告警阈值的查询条件是统计带有 Error 关键字的日志行数,附加查询条件是获取包含 Error 关键字的第一条样例数据。

Flashduty 的日志告警是免费的,如果你不想用 SaaS,就想自己实现这个功能怎么做?其实也可以,通过自定义脚本来接收告警事件,然后在收到告警事件之后判断这是哪一条告警规则,进而根据不同的告警规则去查询 ElasticSearch 获取日志原文,然后再发送告警通知。这可以看做是一个 Enrichment 的逻辑。

如果你是夜莺商业版客户,也可以看到附加查询功能,只不过夜莺商业版用的是 DSL 的方式配置告警规则,而 Flashduty 用的是 SQL 语法。ElasticSearch 支持不同的语法,常用的是 DSL、SQL、EQL 等,在告警这个场景,基本都够用。

实现思路对比

方案 做法 适合场景
Flashduty 附加查询 主查询统计日志数量,附加查询获取第一条样例日志 想快速在告警中带上样例原文
夜莺商业版附加查询 使用 DSL 配置主查询和附加查询 已使用夜莺商业版并希望统一在夜莺侧完成
自定义脚本 enrichment 接收告警事件后,再按规则回查 Elasticsearch 获取样例日志 开源版用户需要自己扩展能力

无论哪种方案,都建议只附带样例日志,而不是完整命中集合。告警消息的目标是帮助值班人确认异常方向,不是替代日志检索页面。

结语

日志告警是监控系统的重要一环,告警事件中包含日志原文是一个常见需求,但是不建议把日志原文全部塞到告警事件中,而是建议只获取第一条样例日志。如果你的日志监控工具不支持获取日志原文,可以考虑使用 Flashduty,或者自己实现一个类似的功能。本文介绍的思路希望对你有所帮助。

FAQ

Q1:为什么夜莺开源版日志告警默认拿不到日志原文?

因为日志告警规则的主查询是为了返回一个可比较的数值,用于阈值判断。它不是一次原文检索查询,所以不会直接把日志行带回告警事件。

Q2:告警里应该放几条日志原文?

通常放一条样例日志就够了。它用于提示异常类型和现场上下文,完整排查仍应回到日志系统按时间范围下钻。

Q3:自己实现 enrichment 时要注意什么?

要根据告警规则选择对应查询条件,限制返回条数和内容长度,并对密码、Token、手机号、个人信息等敏感字段做过滤或脱敏。

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 日志监控
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云