Bootstrap

再也不用熬夜查日志!ELK + 钉钉告警助你轻松应对系统异常

引言

凌晨两点,系统又崩了!运维小张不得不摸黑爬起来,一台一台服务器排查日志。面对分布在不同机器上的服务,逐一查找问题根源简直让人崩溃。有没有更高效的方法?答案就是 ELK(Elasticsearch、Logstash、Kibana)结合钉钉告警,帮你第一时间发现并应对系统问题。本文将介绍如何搭建 ELK 系统,并结合钉钉实现智能告警,让你从熬夜排查日志的泥潭中解放出来。

一、ELK 搭建与日志采集

1. Spring Boot 配置日志采集

在现代微服务应用中,日志采集是实现集中化监控的关键步骤。我们使用 log4j2 + logback 配合 Logstash 进行日志采集,以下是 logback-logstash.xml 的配置:

 

xml

代码解读

复制代码

<?xml version="1.0" encoding="UTF-8"?> <configuration> <springProperty scope="context" name="appName" source="spring.application.name"/> <springProperty scope="context" name="logstash.host" source="log.logstash-host"/> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${logstash.host}</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{"spring.application.name":"${appName}"}</customFields> </encoder> </appender> <root level="info"> <appender-ref ref="logstash"/> </root> </configuration>

小提示:上面的配置将 Spring Boot 应用程序的日志直接发送到 Logstash,便于进行集中化处理和存储。

2. Logstash 配置

Logstash 的主要作用是接收来自不同服务的日志并将其发送到 Elasticsearch 进行存储。以下是 Logstash 的输入和输出配置:

 

bash

代码解读

复制代码

input { tcp { mode => "server" host => "0.0.0.0" port => 4560 codec => json_lines } } output { elasticsearch { hosts => ["http://192.168.0.0:9200"] index => "springboot-logstash-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } }

输入配置负责接收来自应用程序的日志,输出配置将日志数据发送到 Elasticsearch 中保存,以便后续的可视化和分析。

3. Elasticsearch 和 Kibana 的使用

日志数据发送到 Elasticsearch 后,可以通过 Kibana 来实现日志的可视化管理和分析。

  1. 打开 Kibana:在浏览器中访问 http://localhost:5601
  2. 创建索引模式:
    • 导航到 "Stack Management",选择 "Index Patterns"。
    • 点击 "Create index pattern",输入索引模式名称,例如 springboot-logstash-*,并完成创建。

小结:通过 Kibana,我们可以方便地查询和分析日志,快速定位系统中的问题。

二、ELK 配合钉钉的实时告警

即使有了 ELK 系统,如果不能第一时间发现错误,问题仍然可能对业务造成影响。因此,我们引入钉钉机器人,实现实时告警。

1. 使用 ElastAlert 实现钉钉告警

ElastAlert 是一个开源的告警工具,能够监控 Elasticsearch 中的数据并自动生成告警信息。

安装和配置步骤
  1. 安装 Python 环境:推荐使用 conda 安装 Python,避免破坏系统自带的工具。
  2. 安装 ElastAlert:对于高版本的 Elasticsearch,可以使用 ElastAlert2,参考官网文档熟悉规则。
  3. 编写规则文件(rule)
     

    yaml

    代码解读

    复制代码

    name: "Error Alert" schedule: interval: minutes: 2 type: frequency index: "springboot-logstash-*" filter: - term: level.keyword: "ERROR" num_events: 1 timeframe: minutes: 2 realert: minutes: 5 alert: - "command" command: ["/etc/elastalert/dingtalk_alert.sh","{message}","{stack_trace}"] alert_text: "ElastAlert Notification: An ERROR log was detected: {0}" alert_text_args: - "message"

小提示:该规则每两分钟检查一次日志,如果发现错误日志,则通过钉钉机器人发出告警。

2. 编写钉钉通知脚本

下面是一个简单的钉钉通知脚本,用于将错误信息通过钉钉机器人发送到群里:

 

bash

代码解读

复制代码

#!/bin/bash #webhook URL WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=" # 原始 Kibana 链接 ORIGINAL_URL="http://36.139.142.158:5601/app/discover#/?_g=(time:(from:now-15m,to:now))&_a=(index:'logstash-*',query:(match_phrase:(level.keyword:'ERROR')))" # 对 URL 进行编码 ENCODED_URL=$(python3 -c "import urllib.parse; print(urllib.parse.quote(\"${ORIGINAL_URL}\"))") # 构造钉钉协议的链接 ACTION_URL="dingtalk://dingtalkclient/page/link?url=${ENCODED_URL}&pc_slide=false" # 报警内容 STACK_INFO=$(echo "$2" | head -n 20 | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/"/\\"/g') MESSAGE=$(cat <<EOF { "msgtype": "actionCard", "actionCard": { "title": "系统错误通知", "text": "### 系统出现错误\\n\\n请检查系统日志并尽快处理。\\n\\n- 错误描述:$1\\n- 时间:$(date +'%Y-%m-%d %H:%M:%S')\\n- 堆栈信息:${STACK_INFO}", "btnOrientation": "0", "btns": [ { "title": "查看详细日志", "actionURL": "${ACTION_URL}" } ] } } EOF ) # 打印日志 echo "发送消息内容:${MESSAGE}" # 发送 POST 请求到钉钉 curl -X POST -H "Content-Type: application/json" -d "${MESSAGE}" "${WEBHOOK_URL}"

小结:该脚本将告警信息以卡片形式发送到钉钉群里,运维人员可以通过点击链接直接跳转到 Kibana,查看详细日志。

三、总结

通过使用 ELK 构建日志收集系统,并结合钉钉机器人实现告警,系统的日志监控和问题发现能力得到了极大提升。运维人员不再需要逐一排查各个服务器上的日志,而是可以通过实时的钉钉告警快速应对异常。ElastAlert 提供了一种开源、低成本的告警方式,帮助团队及时发现系统中的异常,快速定位和解决问题

;