Zabbix整合ELK实现日志数据的分析实时监控

一,ELK和Zabbix的关系?
ELK是一套组合的日志收集系统,由Elasticsearch、Logstash和Kibana三个软件组成,通过ELK可以收集系统日志、网站日志、应用系统日志等各种日志数据,并且还可以对日志进行过滤、筛选,然后进行集中存放并可用于实时检索、分析。这是ELK的基础功能。

但是如果我们希望在收集日志的时候,能把异常的日志信息(错误,失败)等等提取出来及时发送给运维人员,那么运维就能第一时间的去排查和处理故障,避免很多故障的发生。

那么就可以用zaibbix其实更应该说是(logstash/filebeat)由它来实时读取日志的内容,并且还可以过滤日志信息。通过ELK的读取和筛选过滤等功能,就可以把日志中的一些异常关键字(error、failed、OutOff、Warning)过滤出来,然后通过logstash的zabbix插件将该错误日志发送到zabbix服务端,那么zabbix在接收到这个数据之后,就可以根据自己定义的报警方式来进行报警处理。
二、Logstash与zabbix插件的使用
logstash支持多种输出介质,例如TCP,HTTP,elasticsearch,kafka,Redis,Nagios,zabbix,syslog等,那么我们想将收集到的日志中一些错误信息输出,并报警时,就用到了logstash-output-zabbix这个插件,该插件可以将Logstash与zabbix进行整合,其实就是将logstash收集到的数据进行过滤,把有错误标识的日志输出到zabbix中,最后在通过zabbix的报警机制进行触发,报警。

logstash-output-zabbix是一个社区维护的插件,它默认没有在Logstash中安装,但是安装起来也很容易,直接在logstash中运行如下命令即可:

/usr/local/logstash/bin/logstash-plugin install logstash-output-zabbix

2.1、列出目前已经安装的插件

将列出所有已安装的插件
/usr/local/logstash/bin/logstash-plugin list

#将列出已安装的插件及版本信息

/usr/local/logstash/bin/logstash-plugin list --verbose

#将列出包含namefragment的所有已安装插件

/usr/local/logstash/bin/logstash-plugin list "zabbix"

#将列出特定组的所有已安装插件( input,filter,codec,output)

/usr/local/logstash/bin/logstash-plugin list --group input

2.2、安装插件
要安装某个插件,例如安装kafka插件,可执行如下命令:

/usr/local/logstash/bin/logstash-plugin install logstash-output-kafka

PS:前提是能上网此插件安装方法,会检索托管在公共存储库(RubyGems.org)上的插件,然后下载到本地机器并在Logstash安装之上进行自动安装。
2.3、更新插件
每个插件有自己的发布周期和版本更新,这些更新通常是独立于Logstash的发布周期的。因此,有时候需要单独更新插件,可以使用update子命令获得最新版本的插件。

将更新所有已安装的插件
/usr/local/logstash/bin/logstash-plugin update
将仅更新指定的插件
/usr/local/logstash/bin/logstash-plugin update logstash-output-kafka

2.4、删除插件
如果需要从Logstash插件中删除插件,可执行如下命令:

/usr/local/logstash/bin/logstash-plugin remove logstash-output-kafka

这样就删除了logstash-output-kafka插件。
三、logstash-output-zabbix插件的使用
logstash-output-zabbix安装好之后,就可以在logstash配置文件中使用了,
下面是一个logstash-output-zabbix使用的例子:

zabbix {
    
    
        zabbix_host => "[@metadata][zabbix_host]"
        zabbix_key => "[@metadata][zabbix_key]"
        zabbix_server_host => "x.x.x.x"
        zabbix_server_port => "xxxx"
        zabbix_value => "xxxx"
        }

其中:
zabbix_host:表示Zabbix主机名字段名称, 可以是单独的一个字段, 也可以是 @metadata 字段的子字段, 是必需的设置,没有默认值。

zabbix_key:表示Zabbix项目键的值,也就是zabbix中的item,此字段可以是单独的一个字段, 也可以是 @metadata 字段的子字段,没有默认值。

zabbix_server_host:表示Zabbix服务器的IP或可解析主机名,默认值是 “localhost”,需要设置为zabbix server服务器所在的地址。

zabbix_server_port:表示Zabbix服务器开启的监听端口,默认值是10051。

zabbix_value:表示要发送给zabbix item监控项的值对应的字段名称,默认值是 “message”,也就是将"message"字段的内容发送给上面zabbix_key定义的zabbix item监控项,当然也可以指定一个具体的字段内容发送给zabbix item监控项。
四、将logstash与zabbix进行整合
这里我们以logstash收集日志,然后对日志进行读取,最后选择关键字进行过滤并调用zabbix告警的流程,来看看如何配置logstash实现zabbix告警。
需求:
通过对系统日志文件进行监控,然后去过滤日志信息中的一些关键字,例如ERR、error、ERROR、Failed、WARNING等,将日志中这些信息过滤出来,然后发送到zabbix上,最后借助zabbix的报警功能实现对系统日志中有上述关键字的报警。
对于过滤关键字,进行报警,不同的业务系统,可能关键字不尽相同,例如对http系统,可能需要过滤500、403、503等这些错误码,对于java相关的系统,可能需要过滤OutOfMemoryError、PermGen、Java heap等关键字。在某些业务系统的日志输出中,可能还有一些自定义的错误信息,那么这些也需要作为过滤关键字来使用。
4.1、配置logstash事件配置文件
可以查看/usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns文件来判断有哪些匹配的文件。

接下来就是创建一个logstash事件配置文件,这里将配置文件分成三个部分来介绍,首先是input部分,内容如下:

vim /usr/local/logstash/config/zabbix_output.conf
input {
    
    
        file {
    
    
        path => ["/var/log/secure"]
        type => "system"
        start_position => "beginning"
        }
}
#input部分是从/var/log/secure文件中读取数据,start_position 表示从secure文件开头读取内容。

接着是filter部分,内容如下:

filter {
    
    
    grok {
    
    
             match => {
    
     "message" => "%{SYSLOGTIMESTAMP:message_timestamp} %{SYSLOGHOST:hostname} %{DATA:message_program}(?:\[%{POSINT:message_pid}\])?: %{GREEDYDATA:message_content}" }        #这里通过grok对message字段的数据进行字段划分,这里将message字段划分了5个子字段。其中,message_content字段会在output中用到。
        }

      mutate {
    
    
             add_field => [ "[zabbix_key]", "oslogs" ]      #新增的字段,字段名(key)是zabbix_key,值为oslogs。
             add_field => [ "[zabbix_host]", "%{host}" ]   #新增的字段,字段名(key)是zabbix_host,值可以在这里直接定义,也可以引用字段变量来获取。这里的%{host}获取的就是日志数据的主机名,这个主机名与zabbix web中“主机名称”需要保持一致。
         }
        mutate {
    
            #这里是删除不需要的字段
            remove_field => "@version"
            remove_field => "message"
        }
        date {
    
          #这里是对日志输出中的日期字段进行转换,其中message_timestamp字段是默认输出的时间日期字段,将这个字段的值传给 @timestamp字段。
                match => [ "message_timestamp","MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
        }
}

filter部分是个重点,在这个部分中,重点关注的是message_timestamp字段、message_content字段。
最后是output部分,内容如下:

output {
    
    
        if [message_content]  =~ /(ERR|error|ERROR|Failed)/  {
    
          #定义在message_content字段中,需要过滤的关键字信息,也就是在message_content字段中出现给出的这些关键字,那么就将这些信息发送给zabbix。
              zabbix {
    
    
                        zabbix_host => "[zabbix_host]"      #这个zabbix_host将获取上面filter部分定义的字段变量%{host}的值
                        zabbix_key => "[zabbix_key]"        #这个zabbix_key将获取上面filter部分中给出的值
                        zabbix_server_host => "192.168.2.3"  #这是指定zabbix server的IP地址
                        zabbix_server_port => "10051"           #这是指定zabbix server的监听端口
                        zabbix_value => "message_content"              #这个很重要,指定要传给zabbix监控项item(oslogs)的值, zabbix_value默认的值是"message"字段,因为上面我们已经删除了"message"字段,因此,这里需要重新指定,根据上面filter部分对"message"字段的内容划分,这里指定为"message_content"字段,其实,"message_content"字段输出的就是服务器上具体的日志内容。
                        }
                    }
              stdout {
    
     codec => rubydebug }   #这里是开启调试模式,当第一次配置的时候,建议开启,这样过滤后的日志信息直接输出的屏幕,方便进行调试,调试成功后,即可关闭。
}

将上面三部分内容合并到一个文件zabbix_output.conf中,然后启动logstash服务:

nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/zabbix_output.conf &

4.2、zabbix平台配置日志告警
登录zabbix web平台,选择配置—>模板—>创建模板,名称定为logstash-output-zabbix,如下图所示:
在这里插入图片描述
在这里插入图片描述
创建应用集
点击应用集—–>创建应用集
在这里插入图片描述
创建监控项(itme)
点击监控项—–>创建监控项
在这里插入图片描述
到此为止,zabbix监控logstash的日志数据配置完成。
下面我们模拟一个故障,在任意主机通过ssh登录192.168.2.15主机,然后输入一个错误密码,让系统的/var/log/secure文件产生错误日志,然后看看logstash是否能够过滤到,是否能够发送到zabbix中。

ssh [email protected]
cat /var/log/secure
#内容
Apr 23 11:24:12 wzb sshd[49569]: Failed password for root from 192.168.2.3 port 42978 ssh2

这里面有我们要过滤的关键字Failed,因此logstash会将此内容过滤出来,发送到zabbix上。
接着,登录zabbix web平台,点击监测中—–>最新数据,如果zabbix能够接收到日志,就可以看到下图的最新数据:
在这里插入图片描述
点击历史记录,可以查看详细内容,如下图所示:
在这里插入图片描述
可以看到,红框中的内容就是在logstash中定义的message_content字段的内容。
zaibbix的itme类型及应用场景:
zabbix agent
zabbix自带的客户端程序(被动模式),zabbix server主动向它收集监控数据。agent提供丰富的key,包括不限于cpu、内存、网络、磁盘、web等等。如果你不介意或者系统支持安装此程序,那么他是首选的。需要注意的是,server检索数据有超时限制,最大超时时间30秒,如果检索数据经常超过30秒,那么,不建议你使用主动模式的agent,可以使用如下类型agent active

zabbix agent(active)
也需要安装agent(主动模式),和上一个相同。但是数据由zabbix agent主动提交至zabbix server

simple check
基本的检测,可以检测网络、端口、fping这些,功能很少并且无需安装客户端。

snmp check
snmp v1 check、snmp v2 check、snmp v3 check的功能都是一样的。推荐如下场景:

客户基于安全考虑,不同意安装agent
路由器、打印机等等设备无法安装,但是支持snmp协议
不喜欢频繁对agent升级
zabbix internal
zabbix系统内部用,比如趋势数据记录数了、历史记录数量等等,日常业务监控用不上他。

zabbix trapper
也需要安装agent(主动模式),你需要借助bin/zabbix_sender将数据提交至zabbix server。如下情况适合使用:

检索数据时间较长
同一时间有大量的数据要提交,例如redis info信息,里面包含五六十项数据,通过zabbix_sender来一次性提交,显然比agent来取几十次要方便。
zabbix aggretage
aggregate checks是一个聚合的检测,例如我想知道某个组的host负载平均值,硬盘剩余总量,或者某几台机器的这些数据,简单的说,这个方法就是用来了解一个整体水平,而不需要我们一台台看过去。这个方法的数据全部来之数据库,所以它不需要agent。

external check
zabbix server运行脚本或者二进制文件来执行外部检测,外部检测不需要在被监控端运行任何agentd。

备注:请不要过度使用外部检测,这会严重降低zabbix系统性能

database monitor
zabbix通过调用ODBC来获取数据库的数据以及数据库状态等等信息

IPMI agent
用于监控硬件设备,例如Dell或者hp服务器的主板温度、cpu电压、盖子是不是被打开等等

SSH agent
zabbix使用提供的ssh信息(服务器用户密码或者证书)登录服务器,执行指定的脚本来检索数据。如下人适合用

不会安装agent、不想相撞agent
不担心账号密码/证书放在zabbix里
Telnet agent
同上,Windows不支持ssh,可以使用Telnet agent。

jmx agent
通过jmx监控java jvm,比如tomcat。目前有一个很大的不足,如果tomcat多实例,jmx agent只能监控一个。如果是多实例,建议使用agent + cmdline-jmxclient-0.10.3.jar

zabbix Calculated
计算类型,在几个key值之间做计算,例如redis自带的info命令可以监控keyspace_hits和keyspace_misses这两个值,但是redis的命中率不能直接获取,可以通过zabbix的calculated实现监控redis的命中率

调试grok:http://grokdebug.herokuapp.com/
帮助文档:http://www.ttlsa.com/zabbix/how-to-chose-zabbix-item-type/

猜你喜欢

转载自blog.csdn.net/ZhanBiaoChina/article/details/105684560
今日推荐