日志分析 / 系统运维

Logstash实现邮箱及机器人日志告警

温馨提示:本文最后更新于2021-10-03 21:58:11,某些文章具有时效性,若有错误或已失效,请在下方留言或提交工单提交工单
浅时光 · 10月11日 · 2021年 · · 本文3609个字,预计阅读10分钟 3531次已读

一、场景说明


在我们的生存环境中,为了保证业务系统稳定高效的运行,除了日常的服务器、网络等的监控之外,还有一个最重要的就是业务日志,往往业务系统出现问题都会首先在业务日志中呈现出来,所以日志监控是确保业务系统可以高效稳定对外提供服务的关键,而且我们在做项目开发时,团队也会对日志打印的格式进行统一规范;在日志采集这块大多项目中都是通过ELK这款开源的日志采集系统实现对业务以及系统等关键性日志进行采集展示的;

日志告警实现其实有个插件,叫做ElastAlert,这款插件是Yelp 公司基于python开发的ELK 日志报警插件;本篇文章,我是通过logstash中去过滤日志关键词进行告警的,实现告警信息通过邮箱和企业微信机器人的方式进行通知。

这里呢,我只是提供一个简单的实现方式的思路,不一定完全适合你的项目,再一个就是ELK这个可研究性太多了,还是需要大家自己去琢磨研究了!

  • 说明:这里我是基于Nginx的日志进行演示的,ELK的安装以及Nginx日志采集可以查看之前我写的文章。

二、邮箱告警


1、创建片段文件

  • logstash的配置目录下创建一个Nginx的片段文件
  • 这段配置,主要是通过判断message中的304状态码然后触发告警
[[email protected] ~]# vim /etc/logstash/conf.d/nginx-log.conf
input {
    redis {
          host => "192.168.66.20"
          port => "6379"
          db => "1"
          key => "nginx-log"
          data_type => "list"
          password => "123456"
          type  => "email"
          codec => plain{
             charset=>"UTF-8"
          }
     }
}
filter {
    json {
      source => "message"
    }
    useragent {
      source =>"user_ua"	#这个表示对message里面的哪个字段进行分析
        target =>"userAgent"	#agent将收集出的user agent的信息配置到了单独的字段中
    }
    grok {
       match => { "message" => "%{LOGLEVEL:log_info}" }
    }
    #if [log_info] == "ERROR" {
    if [message] =~ "304" {    #这里判断的是message日志中的304关键词,是为了方便测试,真实环境以项目为准
	throttle {
	    before_count => -1
	    after_count => 3  #在period时间内的消息上限为3
	    period => 120
	    max_age => 240
            key => "%{[log_info]}"
	    add_tag => "nginxerr"  #当事件达到阈值自动给当前事件打上tag
	}
}
    #下面配置中将已经被节流的数据数量做一个缓存存在map中,当日志数量达到我们设置的消息上限时,触发下面的告警。
    if "nginxerr" in [tags] {
	aggregate {
	    task_id => "%{log_info}"
	    code => "map['nginxerrNum'] ||= 0 ; map['nginxerrNum'] += 1
		event.set('nginxerrNum', map['nginxerrNum'])"
	}
        if [nginxerrNum] >= 3 {
            aggregate {
		task_id => "%{log_info}"
		code => "map['nginxerrNum'] = 0"
		add_tag => "nginxerr-num-out"
	    }
	}
    }
}

output {
  stdout {}		#通过控制台实时展示收集的数据信息
  if [log_type] == "nginx.log" {    #这里判断取值filebeat配置文件中的log_type参数
     elasticsearch {
        hosts => ["192.168.66.14:9200","192.168.66.15:9200","192.168.66.16:9200"] #es集群服务器IP
        index => "nginx-log-wechat-%{+YYYY.MM.dd}" #索引名称
        user => "elastic"  #es认证账号和密码
        password => "dqKxwJy3PKjCROUY4XZM"
     }
  }
  if "nginxerr-num-out" in [tags] {
      email {
        port => 587   #邮箱服务器端口
        address => "邮箱服务器"
        username => "告警发件者邮箱"
        password => "邮箱密码或授权码"
        authentication => "plain"
        from => "告警发件者邮箱"
        subject => "Nginx日志告警"
        to => "收件人邮箱"
        use_tls => true
        via => "smtp"
        domain => "smtp.qq.com"
        body => "[Source:] %{log_file};\n [logtype:] %{log_type};\n [Message:] %{message}"
      }
    }
    elasticsearch{
        hosts => ["192.168.66.14:9200","192.168.66.15:9200","192.168.66.16:9200"]
        index => "nginx-304_alter-%{+YYYYMMdd}"
        user => "elastic"  #es认证账号和密码
        password => "dqKxwJy3PKjCROUY4XZM"
    }
}

注意:添加邮箱配置后必须重启logstash才会生效

2、测试邮箱告警

  • 浏览器多次访问Nginx页面。然后查看ES是否已经创建了对应的索引,如果有了索引,然后查看邮箱是否接收到了告警邮件
  • 以下方式运行logstash会把日志信息打印在前台,有助于我们进行测试

[[email protected] ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx-log.conf
Logstash实现邮箱及机器人日志告警-浅时光博客
  • 查看ES是否创建了索引
[[email protected] ~]# curl -sXGET --user elastic:dqKxwJy3PKjCROUY4XZM http://192.168.66.14:9200/_cat/indices?v
Logstash实现邮箱及机器人日志告警-浅时光博客
  • filebeat所运行的节点可以先停止通过systemd启动的进程,然后以命令行方式启动,可以进行测试查看实时采集的日志信息,有助于我们排错
Logstash实现邮箱及机器人日志告警-浅时光博客
  • 检查邮箱,邮箱中已经收到了告警邮件
Logstash实现邮箱及机器人日志告警-浅时光博客

三、微信告警


  • 这里的微信是企业微信,我们首先需要在企业微信群组中创建一个群机器人,然后获取到机器人的token,最后在logstash中配置调用机器人token实现告警
  • 注意:logstash所在服务器必须可以连接到外网,不然无法发送告警信息到机器人

这块,其实只需要将上面邮箱的配置改为企业微信机器人相关的配置即可,配置如下

output {
  stdout {}		#通过控制台实时展示收集的数据信息
  if [log_type] == "nginx.log" {    #这里判断取值filebeat配置文件中的log_type参数
     elasticsearch {
        hosts => ["192.168.66.14:9200","192.168.66.15:9200","192.168.66.16:9200"] #es集群
        index => "nginx-log-wechat-%{+YYYY.MM.dd}" #索引名称
        user => "elastic"  #es认证账号和密码
        password => "dqKxwJy3PKjCROUY4XZM"
     }
  }
  if "nginxerr-num-out" in [tags] {
	http {
	    url => "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={你的key}"
	    http_method => "post"
	    content_type => "application/json; charset=utf-8"
	    format => "message"
	    message => '{"msgtype":"text","text":{"content":"错误告警:120秒内错误日志超过3条,请注意排查!"}}'
	}
    }
    elasticsearch{
        hosts => ["192.168.66.14:9200","192.168.66.15:9200","192.168.66.16:9200"]
        index => "nginx-wechat_alter-%{+YYYYMMdd}"
        user => "elastic"  #es认证账号和密码,开启认证后这里必须填写账号密码
        password => "dqKxwJy3PKjCROUY4XZM"
    }
}




本文作者:浅时光
原文链接:https://www.dqzboy.com/8858.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可
转载时请以超链接形式标明文章原始出处和作者信息

0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

    本站已稳定运行: | 耗时 0.401 秒 | 查询 11 次 | 内存 38.12 MB