使用 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>

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 }
}

3. Elasticsearch 和 Kibana 的使用

在日志数据发送到 Elasticsearch 后,可以使用 Kibana 创建索引模式并查看日志。

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

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

ELK 搭建完成后,虽然可以查看日志,但无法及时发现错误。为了实现实时告警,可以结合钉钉机器人进行系统报警。

1. 使用 ElastAlert 实现钉钉告警

ElastAlert 是一个开源工具,能够检测 Elasticsearch 中的数据并生成告警。

安装和配置步骤:
  1. 安装 Python 环境:推荐使用 conda 安装,避免破坏系统自带工具。

  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"
  4. 编写钉钉通知脚本

#!/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}"

5.群内通知效果截图

三、总结

通过使用 ELK 构建日志收集系统,并结合钉钉机器人实现告警,可以极大提升系统的日志监控和问题发现能力。ElastAlert 提供了一种开源、低成本的告警方式,能够及时发现系统中的异常,帮助快速定位和解决问题。在选择告警方案时,可以根据企业的需求和预算来权衡不同方案的优缺点。

相关推荐
达文汐21 分钟前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
培风图南以星河揽胜22 分钟前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划
启山智软1 小时前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋1 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怪兽源码1 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
恒悦sunsite1 小时前
Redis之配置只读账号
java·redis·bootstrap
梦里小白龙1 小时前
java 通过Minio上传文件
java·开发语言
人道领域1 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
sheji52612 小时前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言