本文来了解一下企业级日志解决方案ELK中的“L”(Logstash),没错,就是这个神奇小组件,用过的都知道,它是ELK不可缺少的组件,完成了输入(input),过滤(fileter),output(输出)工作,也是需要掌握的难点,说到这里 ,又爱又恨;“爱之好,恨之难”;这个Logstash拥有这强大的插件功能,除了帮我们过滤,高效的输出日志,还能帮我们与Zabbix监控相结合?

Logstash支持多种输出类型,能够收集web服务日志,系统日志,内核日志等;但是,既然有日志输出,肯定避免不了错误(error)日志的出现;当Error日志出现的时候,虽然可以通过ELK查找出来,但是ELK不能提供实时报警功能,这就有点尴尬了。不过没关系,Logstash插件能够与Zabbix结合,将需要告警的日志收集起来(例如:error)完成日志监控并触发告警。

首先安装logstash-output-zabbix插件:

[root@localhost ~]# /usr/local/logstash/bin/logstash-plugin install logstash-output-zabbix     Validating logstash-output-zabbixInstalling logstash-output-zabbixInstallation successful

【filebeat】日志采集端


filebeat.inputs:- type: log  enabled: true  paths:   - /var/log/secure   - /var/log/messages   - /var/log/cron  fields:    log_topic: system_logprocessors: - drop_fields:    fields: ["beat", "input", "source", "offset", "prospector"] #这里在filebeat中直接去掉不需要的字段。filebeat.config.modules:  path: ${path.config}/modules.d/*.yml  reload.enabled: falsename: 192.168.37.147        #这是日志输出标识,表明日志来自哪个主机,后面再logstash会用到。output.kafka:  enabled: true  hosts: ["192.168.37.147:9092", "192.168.37.148:9092", "192.168.37.149:9092"]    #日志输出到kafka集群  version: "0.10"  topic: '%{[fields.log_topic]}'   partition.round_robin:    reachable_only: true  worker: 2  required_acks: 1  compression: gzip  max_message_bytes: 10000000logging.level: debug

【Logstash】 数据处理


[root@localhost ~]# vim /usr/local/logstash/config/etc/system_log.confinput {        kafka {        bootstrap_servers => "192.168.37.147:9092,192.168.37.148:9092,192.168.37.149:9092"        topics => ["system_log"]        codec => "json"        }}filter {    if [fields][log_topic] == "system_log" {    #指定filebeat产生的日志主题             mutate {             add_field => [ "[zabbix_key]", "oslogs" ]      #新增的字段,字段名是zabbix_key,值为oslogs。             add_field => [ "[zabbix_host]", "%{[host][name]}" ]   #新增的字段,字段名是zabbix_host,值可以在这里直接定义,也可以引用字段变量来获取。这里的%{[host][name]获取的就是日志数据的来源IP,这个来源IP在filebeat配置中的name选项进行定义。             }         }    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 {        #这里是删除不需要的字段            remove_field => "@version"            remove_field => "message"        }        date {      #这里是对日志输出中的日期字段进行转换,其中message_timestamp字段是默认输出的时间日期字段,将这个字段的值传给 @timestamp字段。                match => [ "message_timestamp","MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]        }}output {        if [message_content]  =~ /(ERR|error|ERROR|Failed)/  {   #定义在message_content字段中,需要过滤的关键字信息,也就是在message_content字段中出现给出的这些关键字,那么就将这些信息发送给zabbix。              zabbix {                        zabbix_host => "[zabbix_host]"      #这个zabbix_host将获取上面filter部分定义的字段变量%{[host][name]的值                        zabbix_key => "[zabbix_key]"        #这个zabbix_key将获取上面filter部分中给出的值                        zabbix_server_host => "192.168.37.149"  #这是指定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"字段输出的就是服务器上具体的日志内容。                        }                    }}

【Logstash】测试并启动


[root@localhost logstash]# nohup /usr/local/logstash/bin/logstash -f config/etc/system_log.conf --path.data=/tmp/

不确定事件配置文件是否正确,可以通过前台运行,输出到stdout;验证filebeat收集的日志是够成功的过滤。
将stdout {codec => rubydebug}指令加入output输出端,前台运行测试,看是够能够过滤出来错误日志输出,效果如下~(ok之后记得将这条指令注释掉并后台运行哦)

[root@localhost logstash]# /usr/local/logstash/bin/logstash -f config/etc/system_log.conf --path.data=/tmp/

Zabbix监控模板创建到告警一触即发


1.创建模板

2.创建应用集,点击应用集-创建应用集

3.创建监控项,点击监控项,创建监控项

4.告警触发,创建 触发器

5.将咱们创建收集日志的模板连接到 需要收集日志的主机,验证告警触发效果。

测试告警


ssh连接192.168.37.147日志收集主机,故意输错密码,让系统产生错误日志,验证是够发送到zabbix端,下面便是我们过滤的错误日志信息,如“error”,”Failed”等~到目前为止,已经成功的收集到错误日志输出了~

总结


来捋一下思路:

我们的架构基本不变,仍然是filebat收集日志推送到kibana消息队列,然后由Logstash前去拉取日志数据,经过处理最后中转出去;只不过是中转输出到zabbix上面而已;能够实现这个功能的,最核心的功臣就是Logsatsh的插件(logstash-output-zabbix);

在这里需要注意的是:filebeat收集端的IP一定要与zabbix监控主机的IP相对应,否则日志是过不来的~

分享一个小技巧:通过该命令可以测试定义在zabbix上的键值;出现以下输出变为正常~,如果failed非零值表示失败

[root@localhost zabbix_sender]# /usr/local/zabbix/bin/zabbix_sender -s 192.168.37.147 -z 192.168.37.149 -k "oslogs" -o 1info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000081"sent: 1; skipped: 0; total: 1
  • -s:指定本地agent端

  • -z:指定zabbix服务端

  • -k:指定键值

当你内心躁动,久久不能平静,该学习了,为什么要学习,为什么要努力? 因为你想要的东西都很贵,求而不得,自己太过于平凡,所以你除了努力学习,什么都做不了,只想着,平凡中干出不平凡的事~

©著作权归作者所有:来自51CTO博客作者mob604756e5abbc的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. ELK企业日志平台收集Nginx访问日志
  2. 10 个Linux Awk文本处理经典案例
  3. SQL优化小讲堂(六)——善待数据库从建表开始
  4. 记一次Oracle数据更新经历
  5. wordpress日志审计插件audit-trail安装
  6. Oracle归档日志满错误(ORA-00257)
  7. 你有一份经典SQL语句大全,请注意查收!!!
  8. 日志轮替logrotate
  9. 容器的日志管理ELK

随机推荐

  1. android之实现各个组件点击事件监听
  2. CMAKE 在Linux下 构建android 编译、打包
  3. 短信接收--Android彩信的接收流程(应用层)
  4. Process 'command 'C:\zssinstallsoft\
  5. android 主线程和子线程之间的消息传递
  6. Android学习中遇到的问题及解决方案
  7. Android Material Design : CollapsingTo
  8. android mtk6732 camera otp 加载流程
  9. Android应用程序键盘(Keyboard)消息处理机
  10. android ImageView 设置背景选择器select