如果你也有这种场景,那么你就需要一个及时告警的功能。
实现方案
实现及时告警分以下两种场景:
- 有ELK日志收集
- 没有ELK日志收集
没有ELK日志收集的方案
~~很简单,搭建一个日志收集环境(O(∩_∩)O哈哈)~
需要在业务代码中嵌入硬编码,每次catch到异常直接发送告警信息告警平台进行告警
有ELK日志收集的方案
最核心的是 elasticsearch组件,所有的告警方案前提条件都是告警日志需要进ES,然后定时从ES中检索出符合业务规定的告警日志(比如ERROR日志),如果检索出来的告警日志满足一定条件就触发告警通知。
实现方式主要有以下几种:
- ES WATCHER
这个是elasticsearch的官方插件,它可以根据数据的变化提供警报和通知,目前是收费的,具体操作配置可以参看官方地址
- elastalert
是Yelp公司基于python写的告警框架,大家可以去GitHub上查看具体使用方法。elastalert
- 自定义开发
自定义开发实现
主要由以下几个步骤实现:
- 分离出单独的告警日志,与业务日志分离
- 在logstash中解析日志,构建格式化的告警日志,需要有以下几个关键参数:
日志级别、日志时间、日志描述、开发模块、关联主键、请求参数、响应参数
- 定时任务每隔一段时间去ES中检索符合要求的日志,如果检索到就发送告警通知。
核心代码
- 日志格式化
我们直接在客户端构建好格式化的日志,以json的形式输出到日志文件中,这样在logstash解析的时候直接使用json解析即可。
这一步不是必须的,可以自由构建日志格式,然后在logstash解析的时候使用grok语法进行解析。
publicclassAlarmLog { /**日志级别*/privateStringlogLevel; /**日志描述*/privateStringmessage; /**关联主键 一般使用requestId*/privateStringrefCode; /**请求参数*/privateStringparm; /**响应数据*/privateStringresponse; /**开发模块,根据此参数配置模块负责人*/privateStringmodule; /**日志时间*/privatelonglogTime; ... }
- 关键查询
在单独的定时器项目中使用如下查询语法就可以检索出具体的告警日志。检索出来就可以根据日志中的模块字段找出具体的模块负责人,然后发送告警通知给负责人。
publicList<LogDoc>findRangeLogByLevel(DateTimeminRange, DateTimemaxRange, StringlogLevel) { //需要强制转换成小写logLevel=logLevel.toLowerCase(); SearchQuerysearchQuery=newNativeSearchQueryBuilder() .withQuery(boolQuery() //module 必须有值才能告警 .must(existsQuery("module")) .must(termQuery("logLevel", logLevel)) .must(rangeQuery("logTime") .from(minRange.getMillis()) .to(maxRange.getMillis()))) .build(); returnelasticsearchTemplate.queryForList(searchQuery, LogDoc.class); }
好了,各位朋友们,本期的内容到此就全部结束啦,能看到这里都是优秀的同学,下一个升职加薪的就是你了。
如果觉得这篇文章对你有所帮助的话请扫描下面二维码加个关注。“转发” 加 “在看”,养成好习惯!咱们下期再见!