ELK日志监控平台告警升级(邮件+钉钉)

本文介绍了一次邮件告警系统故障排查过程,包括如何调整配置以解决告警通知无法送达的问题,并集成了钉钉机器人进行监控报警。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

近期,邮件告警通知无法送达,导致部分错误信息开发人员没有及时收到,触发了手动电话通知机制(客户,你懂得)。这个锅我背,之前好好的,突然前段时间就不好使了(脚本什么的并没有动过)。快周末了,重新调整了一下告警通知,顺便加入钉钉机器人监控报警。

服务配置

服务器:192.168.1.180
访问地址:http://logs.52itstyle.com

相关软件

ELK(ElasticSearch、Logstash、Kibana)、Nginx、sendmail、钉钉

告警通知

邮件 + 钉钉通知

logstash 脚本:

input {
        redis {
                host => "192.168.1.180"
                port => 6379
                data_type => "list"
                key => "logstash-tomcat-error"
                type => "redis-input"
                password => "123456"
                db => 0
        }
}
output {
        elasticsearch {
               hosts => ["192.168.1.180:9200"]
        }
        exec {
            command  =>  "/home/logs/script/alarm.sh  %{type} %{message} %{path}"
        }
}
  • message:详细错误日志信息
  • type:项目名称标识
  • path:日志文件路径

告警脚本 alarm.sh:

#!/bin/sh
curl 'https://oapi.dingtalk.com/robot/send?access_token=*************' \
   -H 'Content-Type: application/json' \
   -d '
  {"msgtype": "text",
    "text": {
        "content":"'$1':错误预警,请登录日志平        "content":"'$1':错误预警,请登录日志平监控查看 http://logs.52itstyle.com"
监控查看 http://logs.52itstyle.com"
     }
  }'echo  $3 $1:$2 | mail -s  凌晨一点的bug,就知道养生  345849402@qq.com 10000@qq.com;
钉钉告警

钉钉监控

钉钉监控

注意事项
  • linux shell多条命令使用;分隔
  • linux shell中curl发送post请求json,数据里变量要用''括起来

  • 钉钉机器人,对于message信息处理不友好,空格以后的文本会被截取,暂且使用邮件通知

文章来源:原文链接

<think>我们使用Watcher来实现基于KQL的错误日志邮件提醒。Watcher是Elasticsearch的告警功能,可以定期执行查询,当满足条件时触发动作(如发送邮件)。 根据用户需求,我们需要: 1. 使用KQL(Kibana Query Language)来过滤ERROR级别的日志。参考引用[1]中的例子:`log_level:error and message:*timeout*`,我们可以构建类似的查询。 2. 配置Watcher,定期执行这个KQL查询,当有新的错误日志时发送邮件。 步骤: 一、确定KQL查询条件 假设我们的日志中包含字段`log_level`(记录日志级别)和`message`(日志消息)。我们想要监控所有ERROR级别的日志且可能根据项目需要添加额外的过滤条件(例如,特定的错误消息关键词)。这里我们以简单的ERROR级别为例: ``` log_level: "ERROR" ``` 二、创建Watcher 在Kibana中,进入“Stack Management” > “Watcher” > “Create advanced watch”。 1. 定义触发器(Trigger): 设置执行间隔,例如每分钟执行一次: ```json "trigger": { "schedule": { "interval": "1m" } } ``` 2. 定义输入(Input): 使用搜索输入,执行KQL查询。注意,我们需要查询最近一段时间内的日志(例如最近1分钟),以避免重复告警。 ```json "input": { "search": { "request": { "search_type": "query_then_fetch", "indices": ["your-log-index-*"], // 替换为你的日志索引模式 "body": { "size": 0, // 因为我们只需要计数,不需要具体文档 "query": { "bool": { "must": [ { "term": { "log_level.keyword": "ERROR" } }, // 使用term精确匹配,注意字段类型,如果是text类型可能需要用.keyword { "range": { "@timestamp": { "gte": "now-1m", // 查询最近1分钟 "lte": "now" } } } ] } } } } } } ``` 注意:上面的查询中,我们使用了`term`查询来匹配`log_level`字段。如果字段是文本类型且做了分词,那么可能需要使用`.keyword`子字段(假设你映射了keyword类型)。如果日志级别字段是字符串且是精确值,使用`.keyword`更合适。另外,我们只查询最近1分钟内的日志,避免重复告警。 3. 定义条件(Condition): 如果查询到的错误日志数量大于0,则触发动作。 ```json "condition": { "compare": { "ctx.payload.hits.total": { "gt": 0 } } } ``` 4. 定义动作(Actions): 发送邮件。需要先在Kibana中配置SMTP设置(在kibana.yml中配置,然后重启Kibana)。 ```json "actions": { "send_email": { "email": { "profile": "standard", "to": ["recipient@example.com"], // 收件人邮箱 "subject": "ELK告警:发现ERROR日志", "body": { "text": "在最近1分钟内,发现 {{ctx.payload.hits.total}} 条ERROR日志。请及时处理。\n\n详细信息可查看Kibana: http://your-kibana-url/app/discover" } } } } ``` 三、完整的Watcher JSON配置示例 将上述部分组合起来,得到完整的Watcher配置: ```json { "trigger": { "schedule": { "interval": "1m" } }, "input": { "search": { "request": { "search_type": "query_then_fetch", "indices": ["your-log-index-*"], "body": { "size": 0, "query": { "bool": { "must": [ { "term": { "log_level.keyword": "ERROR" } }, { "range": { "@timestamp": { "gte": "now-1m", "lte": "now" } } } ] } } } } } }, "condition": { "compare": { "ctx.payload.hits.total": { "gt": 0 } } }, "actions": { "send_email": { "email": { "profile": "standard", "to": ["recipient@example.com"], "subject": "ELK告警:发现ERROR日志", "body": { "text": "在最近1分钟内,发现 {{ctx.payload.hits.total}} 条ERROR日志。请及时处理。\n\n详细信息可查看Kibana: http://your-kibana-url/app/discover" } } } } } ``` 四、注意事项 1. **索引名称**:请将`your-log-index-*`替换为实际的索引模式,例如`error-*`(如果按照之前的多项目配置,可能是`error-projectA-*`等)。 2. **字段名称**:确保`log_level`字段在你的日志中存在,且类型正确。如果字段名称不同,请修改为实际的字段名(如`level`、`severity`等)。 3. **时间范围**:`now-1m`和`interval`保持一致,都是1分钟。如果调整了间隔,时间范围也要相应调整。 4. **邮件配置**:确保Kibana已经配置了SMTP服务器,否则邮件无法发送。配置示例(kibana.yml): ```yaml xpack.actions.email: transport: host: 'smtp.example.com' port: 587 secure: true auth: user: 'your-email@example.com' pass: 'your-password' ``` 5. **测试**:创建Watcher后,可以手动运行测试,或者生成一条ERROR日志来验证。 五、多项目扩展 如果多个项目共用ELK,我们可以在Watcher中按项目分组,为每个项目发送独立的告警。但是,Watcher本身不支持在一个Watch中为每个项目分别发送邮件(除非使用多个Watcher)。建议: - 为每个项目创建独立的Watcher(每个Watcher过滤特定项目的索引和日志)。 - 或者,在Watcher的查询条件中加入项目标识,然后通过脚本遍历不同项目,但这种方法复杂,不推荐。 更简单的方式是为每个项目单独创建一个Watcher,例如: - 项目A:索引为`error-projectA-*`,Watcher的查询条件中指定索引,设置收件人为项目A的团队。 - 项目B:索引为`error-projectB-*`,类似配置。 这样每个项目的告警都是独立的。 六、验证 1. 模拟产生ERROR日志2. 等待1分钟,检查邮件是否收到。 七、常见问题 1. 收不到邮件:检查Kibana的SMTP配置、网络连接、邮箱是否被拦截等。 2. 告警不触发:检查索引名称、字段名称是否正确,时间范围是否覆盖了日志时间,以及查询条件是否能匹配到日志。 3. 重复告警:考虑在邮件中加入日志条目的ID或者时间戳,避免重复发送相同错误的告警(Watcher本身没有状态记录,所以每次满足条件都会触发)。 如果需要更复杂的告警(例如,相同错误10分钟内不重复告警),可能需要使用ElastAlert等第三方工具。 以上是基于Watcher实现ERROR日志邮件告警的完整方案。</think>### 使用ELK和Watcher实现基于KQL的错误日志邮件提醒 以下是配置ELK和Watcher实现基于KQL查询的错误日志邮件提醒的完整步骤: --- #### 一、配置前提 1. **Elasticsearch版本**:7.x+(需启用X-Pack) 2. **日志字段要求**: - 包含日志级别字段(如`log_level`) - 包含项目标识字段(如`project`) - 包含时间戳字段`@timestamp` --- #### 二、创建Watcher配置 在Kibana中创建高级监视器(`Management > Watcher > Create advanced watch`): ```json { "trigger": { "schedule": { "interval": "5m" // 每5分钟执行一次 } }, "input": { "search": { "request": { "search_type": "query_then_fetch", "indices": ["error-logs-*"], // 错误日志索引模式 "body": { "size": 0, "query": { "bool": { "must": [ { "kql": "log_level:ERROR" // 使用KQL过滤ERROR日志 }, { "range": { "@timestamp": { "gte": "now-5m", // 时间范围与执行间隔一致 "lte": "now" } } } ] } }, "aggs": { "projects": { "terms": { "field": "project.keyword", // 按项目分组 "size": 10 } } } } } } }, "condition": { "compare": { "ctx.payload.aggregations.projects.buckets": { "not_empty": {} // 有错误日志时触发 } } }, "actions": { "send_email": { "email": { "profile": "standard", "to": ["team@example.com"], "subject": "ELK告警: {{ctx.payload.aggregations.projects.buckets.0.key}}项目发现ERROR日志", "body": { "text": """ 项目名称: {{ctx.payload.aggregations.projects.buckets.0.key}} 错误数量: {{ctx.payload.aggregations.projects.buckets.0.doc_count}} 时间范围: {{ctx.trigger.scheduled_time}} - {{ctx.execution_time}} 最近错误示例: {{#ctx.payload.aggregations.projects.buckets}} - {{key}}: {{doc_count}}条错误 {{/ctx.payload.aggregations.projects.buckets}} 查看日志: http://kibana.example.com/app/discover?index=error-logs-*&q=log_level:ERROR """ } } } } } ``` > **关键配置说明**: > 1. `kql: "log_level:ERROR"`:使用KQL语法过滤ERROR级别日志[^1] > 2. `terms.field: "project.keyword"`:按项目分组统计 > 3. `interval: "5m"` 与 `range: now-5m`:时间窗口匹配 > 4. 邮件模板使用Mustache语法动态填充项目信息 --- #### 三、Logstash预处理配置 确保日志包含必要字段(在logstash.conf中添加): ```ruby filter { # 提取日志级别 grok { match => { "message" => "\[%{LOGLEVEL:log_level}\]" } } # 添加项目标识 if [log][file][path] =~ "/var/log/projectA" { mutate { add_field => { "project" => "projectA" } } } # 只保留ERROR日志 if [log_level] != "ERROR" { drop {} } } output { elasticsearch { hosts => ["es-server:9200"] index => "error-logs-%{+YYYY.MM.dd}" // 统一错误日志索引 } } ``` --- #### 四、SMTP配置(kibana.yml) 启用邮件发送功能: ```yaml xpack.actions.email: transport: host: 'smtp.example.com' port: 587 secure: true auth: user: 'alerts@example.com' pass: 'your-password' ``` --- #### 五、多项目优化方案 1. **动态项目告警**: ```json "actions": { "per_project_alert": { "foreach": "ctx.payload.aggregations.projects.buckets", "email": { "to": "{{ctx.payload.aggregations.projects.buckets.0.key}}_team@example.com", "subject": "项目{{ctx.payload.aggregations.projects.buckets.0.key}} ERROR告警" } } } ``` 2. **错误阈值设置**: ```json "condition": { "script": { "source": """ return ctx.payload.aggregations.projects.buckets .find(b -> b.doc_count > 5) != null """ } } ``` --- #### 六、验证与测试 1. **测试KQL查询**: ```json GET error-logs-*/_search { "query": { "kql": "log_level:ERROR and project:projectA" } } ``` 2. **手动触发Watcher**: ```bash POST _watcher/watch/error_log_alert/_execute ``` 3. **检查邮件队列**: ```json GET _watcher/stats?metric=queued_watches ``` --- ### 常见问题解决 1. **Watcher未触发** ⇒ 检查调度时间:`GET _watcher/watch/error_log_alert` ⇒ 验证权限:确保用户有`watcher_admin`角色[^4] 2. **KQL查询无效** ⇒ 使用`_validate/query`端点验证: ```json POST error-logs-*/_validate/query?explain { "query": { "kql": "log_level:ERROR" } } ``` 3. **邮件发送失败** ⇒ 测试SMTP连接: ```json POST _watcher/_execute { "action_modes": ..., "record_execution": true } ``` --- ### 相关问题 1. 如何为不同项目设置不同的错误阈值? 2. Watcher如何实现错误日志的滚动聚合(如1小时内相同错误只告警一次)? 3. 如何将ELK告警集成到Slack或钉钉?[^3] 4. 在Kibana中如何监控Watcher的执行状态? 5. 如何优化Watcher性能避免影响Elasticsearch集群?[^4] [^1]: KQL语法支持字段过滤和通配符匹配[^1] [^2]: Watcher配置需注意时间窗口与执行间隔的匹配[^2] [^3]: ELK告警可通过Webhook集成第三方系统[^3] [^4]: 生产环境需配置TLS加密和访问控制[^4]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值