ELK统一日志管理平台第三篇-logstash grok插件的使用

1. ELK统一日志管理平台第三篇-logstash grok插件的使用

  在本篇博文中,主要讲解如下几个知识点和实践经验,供大家参考:

  1. 关于JAVA应用程序的日志内容标准规范:

  2. 如何使用logstash的grok插件来完成message字段的拆分:

  3. 定时删除Es的索引:

1. 关于JAVA应用程序的日志内容标准规范:

  最近公司一直在主推ELK这个项目,而我是ELK这个项目的运维人员。所以针对ELK项目会有很多经验输出;由于我们公司的业务系统以JAVA语言开发为主,特别是Spring Cloud、Spring Boot等框架为主。如何将业务系统的日志标准化是研发架构师需要考虑的问题。目前我们的ELK日志规范定义如下:

<pattern>[%date{ISO8601}][%level] %logger{80} [%thread] Line:%-3L [%X{TRACE_ID}] ${dev-group-name}
${app-name} - %msg%n</pattern>

|时间|日志级别|类文件|线程数|代码发生行|全局流水号|开发团队|系统名称|日志信息

时间:记录日志产生时间;
日志级别:ERROR、WARN、INFO、DEBUG;
类文件:打印类文件名称;
线程名:执行操作线程名称;
代码发生行:日志事件发生在代码中位置;
全局流水号:贯穿一次业务流程的全局流水号;
开发团队: 系统开发的团队名称
系统名称:项目名称组建名
INFO: 记录详细日志信息

比如一个业务系统的日志输出标准格式如下:

[2019-06-2409:32:14,262] [ERROR] com.bqjr.cmm.aps.job.ApsAlarmJob [scheduling-1] []
tstteam tst Line:157 - ApsAlarmJob类execute方法,‘【测试系统预警】校验指标异常三次预警‘预警出错:nested
exception is org.apache.ibatis.exceptions.PersistenceException: ### Error
querying database. Cause: java.lang.NullPointerException ### Cause:
java.lang.NullPointerException org.mybatis.spring.MyBatisSystemException:
nested exception is

2. 如何使用logstash的grok插件来完成message字段的拆分:

  现在我们的日志都按照标准字段输出了,但是在kibana界面还是一个message字段。现在就要实现将message分解为每一个字段,可以通过每一个字段进行搜索;

  我们的ELK日志平台的架构是: 所有业务系统安装filebeat日志收集软件,将日志原封不动的收集到KAFKA集群,由kafka集群再发送到logstash集群,由logstash集群再输出到ES集群,由ES集群再输出到kibana展示和搜索。中间为什么会用到logstash软件,主要是因为logstash软件有强大的文本处理功能,如grok插件。能够实现文本的格式化输出;

  logstash软件已经内置了很多正则表达式模板,可以匹配常用的nginx、httpd、syslog等日志;

#logstash默认grok语法模板路径:
/usr/local/logstash-6.2.4/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns

#logstash自带的grok语法模板:
[[email protected] patterns]# ll
total 116
-rw-r--r-- 1 root root   271 Jun 24 16:05 application
-rw-r--r-- 1 root root  1831 Apr 13  2018 aws
-rw-r--r-- 1 root root  4831 Apr 13  2018 bacula
-rw-r--r-- 1 root root   260 Apr 13  2018 bind
-rw-r--r-- 1 root root  2154 Apr 13  2018 bro
-rw-r--r-- 1 root root   879 Apr 13  2018 exim
-rw-r--r-- 1 root root 10095 Apr 13  2018 firewalls
-rw-r--r-- 1 root root  5338 Apr 13  2018 grok-patterns
-rw-r--r-- 1 root root  3251 Apr 13  2018 haproxy
-rw-r--r-- 1 root root   987 Apr 13  2018 httpd
-rw-r--r-- 1 root root  1265 Apr 13  2018 java
-rw-r--r-- 1 root root  1087 Apr 13  2018 junos
-rw-r--r-- 1 root root  1037 Apr 13  2018 linux-syslog
-rw-r--r-- 1 root root    74 Apr 13  2018 maven
-rw-r--r-- 1 root root    49 Apr 13  2018 mcollective
-rw-r--r-- 1 root root   190 Apr 13  2018 mcollective-patterns
-rw-r--r-- 1 root root   614 Apr 13  2018 mongodb
-rw-r--r-- 1 root root  9597 Apr 13  2018 nagios
-rw-r--r-- 1 root root   142 Apr 13  2018 postgresql
-rw-r--r-- 1 root root   845 Apr 13  2018 rails
-rw-r--r-- 1 root root   224 Apr 13  2018 redis
-rw-r--r-- 1 root root   188 Apr 13  2018 ruby
-rw-r--r-- 1 root root   404 Apr 13  2018 squid

#其中有一个java的模板,已经内置了很多java类、时间戳等
[[email protected] patterns]# cat java
JAVACLASS (?:[a-zA-Z$_][a-zA-Z$_0-9]*\.)*[a-zA-Z$_][a-zA-Z$_0-9]*
#Space is an allowed character to match special cases like ‘Native Method‘ or ‘Unknown Source‘
JAVAFILE (?:[A-Za-z0-9_. -]+)
#Allow special <init>, <clinit> methods
JAVAMETHOD (?:(<(?:cl)?init>)|[a-zA-Z$_][a-zA-Z$_0-9]*)
#Line number is optional in special cases ‘Native method‘ or ‘Unknown source‘
JAVASTACKTRACEPART %{SPACE}at %{JAVACLASS:class}\.%{JAVAMETHOD:method}\(%{JAVAFILE:file}(?::%{NUMBER:line})?\)
# Java Logs
JAVATHREAD (?:[A-Z]{2}-Processor[\d]+)
JAVACLASS (?:[a-zA-Z0-9-]+\.)+[A-Za-z0-9$]+
JAVAFILE (?:[A-Za-z0-9_.-]+)
JAVALOGMESSAGE (.*)
# MMM dd, yyyy HH:mm:ss eg: Jan 9, 2014 7:13:13 AM
CATALINA_DATESTAMP %{MONTH} %{MONTHDAY}, 20%{YEAR} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) (?:AM|PM)
# yyyy-MM-dd HH:mm:ss,SSS ZZZ eg: 2014-01-09 17:32:25,527 -0800
TOMCAT_DATESTAMP 20%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) %{ISO8601_TIMEZONE}
CATALINALOG %{CATALINA_DATESTAMP:timestamp} %{JAVACLASS:class} %{JAVALOGMESSAGE:logmessage}
# 2014-01-09 20:03:28,269 -0800 | ERROR | com.example.service.ExampleService - something compeletely unexpected happened...
TOMCATLOG %{TOMCAT_DATESTAMP:timestamp} \| %{LOGLEVEL:level} \| %{JAVACLASS:class} - %{JAVALOGMESSAGE:logmessage}
[[email protected] patterns]#

#但是仅靠默认的这个模板还是不能匹配我们公司自定义的日志内容,所以我还自己写了一个
[[email protected] patterns]# cat application
APP_DATESTAMP 20%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND})
THREADS_NUMBER (?:[a-zA-Z0-9-]+)
GLOBAL_PIPELINE_NUMBER (?:[a-zA-Z0-9-]+)
DEV_TEAM (?:[a-zA-Z0-9-]+)
SYSTEM_NAME (?:[a-zA-Z0-9-]+)
LINE_NUMBER (Line:[0-9]+)
JAVALOGMESSAGE (.*)
APPLOG \[%{APP_DATESTAMP:timestamp}\] \[%{LOGLEVEL:loglevel}\] %{JAVACLASS:class} \[%{THREADS_NUMBER:threads_number}\] \[%{GLOBAL_PIPELINE_NUMBER:global_pipeline_number}\] %{DEV_TEAM:team} %{SYSTEM_NAME:system_name} %{LINE_NUMBER:linenumber} %{JAVALOGMESSAGE:logmessage}

# 然后就是配置logstash

[[email protected] patterns]# cat /usr/local/logstash/config/yunyan.conf
input {
  kafka {
    bootstrap_servers => "192.168.1.12:9092,192.168.1.14:9092,192.168.1.15:9092"
    topics_pattern => "elk-tst-tst-info.*"
    group_id => "test-consumer-group"
    codec => json
    consumer_threads => 3
    decorate_events => true
    auto_offset_reset => "latest"
  }
}

filter {
    grok {
             match => {"message" => ["%{APPLOG}","%{JAVALOGMESSAGE:message}"]}  #注意这里的APPLOG就是我上面自定义的名字
             overwrite => ["message"]

}
}

output {
  elasticsearch {
     hosts => ["192.168.1.19:9200","192.168.1.24:9200"]
     user => "elastic"
     password => "111111"
     index => "%{[@metadata][kafka][topic]}-%{+YYYY-MM-dd}"
     workers => 1
  }
}

#output {
#   stdout{
#      codec => "rubydebug"
#  }
#}

#一般建议调试的时候,先输出到stdout标准输出,不要直接输出到es.等在标准输出确认已经OK了,所有的格式化字段都可以分别输出了,再去输出到ES;
# 如何将grok的正则表达式写好,有一个在线的grok表达式测试地址:  http://grokdebug.herokuapp.com/

  输出了标准的日志内容之后,就可以根据key:value的格式查询搜索了,比如可以在搜索栏输入: loglevel:ERROR 只搜索级别为ERROR的日志内容;

3. 定时删除Es的索引:

  索引的定义是根据logstash里面的output插件配置,比如按天的索引,就是索引名后面跟-%{+YYYY-MM-dd},如果想改成按照月的索引,那就是-%{+YYYY-MM}。不同内容的索引,定义的方式应该也是不同的。比如操作系统类的日志,每天的变化不多,就可以按照月来划分索引。但是业务系统本身的程序日志,由于每天产生的日志比较多,就比较适合使用按天的索引。因为对于elasticsearch,索引太大的话也会影响性能,索引太多的话也会影响性能。elasticsearch的主要性能瓶颈在CPU
我在运维ELK这个项目的过程中,就发现了因为索引文件太大,索引数量太多,但是我们的es data节点cpu配置太低,引起ES集群崩溃。解决此问题有几种途径,第一就是定时删除没有用的索引,第二就是优化ES的索引参数。第二点我还没有实践,后续实践了再总结文档出来;先把定时删除索引和手工删除索引的方法写出来。

#/bin/bash
#指定日期(7天前)
DATA=`date -d "1 week ago" +%Y-%m-%d`

#当前日期
time=`date`

#删除7天前的日志
curl -u elastic:654321 -XGET "http://192.168.1.19:9200/_cat/indices/?v"|grep $DATA
if [ $? == 0 ];then
  curl -u elastic:654321 -XDELETE "http://127.0.0.1:9200/*-${DATA}"
  echo "于 $time 清理 $DATA 索引!"
fi

curl -u elastic:654321 \-XGET "http://192.168.1.19:9200/_cat/indices/?v"|awk ‘{print $3}‘|grep elk >> /tmp/es.txt
#手工删除索引,将索引名输出到一个文本文件,然后通过循环删除的方法
for i in `cat /tmp/es.txt`;do curl -u elastic:654321 -X DELETE "192.168.1.19:9200/$i";done

  好的,今天暂时就写到这里了。最近工作特别忙,很难抽出时间来更新技术博客。基本都是晚上加班很晚或者早上起来很早把博客更新一下,工作时间任务很多真的很难抽出时间更新博文了。还是感谢大家的持续关注。

博文的更详细内容请关注我的个人微信公众号 “云时代IT运维”,本公众号旨在共享互联网运维新技术,新趋势; 包括IT运维行业的咨询,运维技术文档分享。重点关注devops、jenkins、zabbix监控、kubernetes、ELK、各种中间件的使用,比如redis、MQ等;shell和python等运维编程语言;本人从事IT运维相关的工作有十多年。2008年开始专职从事Linux/Unix系统运维工作;对运维相关技术有一定程度的理解。本公众号所有博文均是我的实际工作经验总结,基本都是原创博文。我很乐意将我积累的经验、心得、技术与大家分享交流!希望和大家在IT运维职业道路上一起成长和进步;

原文地址:https://blog.51cto.com/zgui2000/2413917

时间: 2024-11-14 21:09:31

ELK统一日志管理平台第三篇-logstash grok插件的使用的相关文章

七牛云智能日志管理平台正式发布

七牛云智能日志管理平台实现了数据的全生命周期智能管理. 适用于数据中心监控.应用质量管理.统一日志管理.物联网数据监控等典型应用场景,并提供一系列行业解决方案. 致力于让用户以最低的心智负担,最佳的体验,最快的速度获得最大的价值. 推荐阅读: 陈超:七牛云智能日志管理平台的应用与设计 扫码立即了解智能日志管理平台 原文地址:http://blog.51cto.com/7741292/2146673

Spring MVC 中使用AOP 进行统一日志管理--XML配置实现

1.介绍 上一篇博客写了使用AOP进行统一日志管理的注解版实现,今天写一下使用XML配置实现版本,与上篇不同的是上次我们记录的Controller层日志,这次我们记录的是Service层的日志.使用的工程还是原来的那个,具体的Spring mvc 工程搭建暂不介绍.上篇记录controller层日志的时候是将切面类组件叫给spring MVC 进行管理,因为 controller 也是交给spring MVC进行管理的,但是记录service 层日志的时候应该就应该再spring 容器中进行了,

性能优化分析Spring Cloud ELK+kafka日志分析平台

一.概述 在笔者的上一篇博客介绍了Spring Cloud ELK+kafka日志分析平台的搭建,http://xuyangyang.club/articles/2018/05/24/1527176074152.html,但是笔者在测试环境中发现,在logstash采用了grok插件去处理日志埋点和解析的时候发现了高资源占用,在阿里云8核16G的服务器部署后,测试环境大概每秒不超过几百条的日志的解析下竟然CPU占用高达95%左右,笔者分析了其中的原因,首先由于几个服务的日志格式相关配置还没有落地

ELK日志管理平台部署简介

ELK是对Elasticsearch.Logstash.Kibana整合平台的简称.在日常的运维工作中,要实时监控服务器的业务.系统和硬件状态,除了使用监控之外,还需要搜集大量的日志来进行分析.但是在面对海量的服务器和集群时,通过单台登录查询的方式显然是不可能的,对于不同时间段和集群日志的分析仅仅通过简单的脚本来统计也是难以实现.ELK日志平台通过日志搜集,查询检索和前端展示的方式帮我们实现了这样的功能. Elasticsearch是个开源分布式搜索引擎,具有分布式,零配置,自动发现,索引自动分

centos7搭建ELK Cluster集群日志分析平台(三)

续  centos7搭建ELK Cluster集群日志分析平台(一) 续  centos7搭建ELK Cluster集群日志分析平台(二) 已经安装好elasticsearch 5.4集群和logstash 5.4 安装kibana步骤 1.下载安装Kibana  ~]#wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.0-x86_64.rpm 如果链接失效,官网下载:https://www.elastic.co/down

centos7搭建ELK Cluster日志分析平台(一)

应用场景:ELK实际上是三个工具的集合,ElasticSearch + Logstash + Kibana,这三个工具组合形成了一套实用.易用的监控架构, 很多公司利用它来搭建可视化的海量日志分析平台. 官网下载地址:https://www.elastic.co/downloads  Elasticsearch: 一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口. Elasticsearch是用Java开发的,并作为Apache许可条款

Centos7下ELK+Redis日志分析平台的集群环境部署记录

之前的文档介绍了ELK的架构基础知识,下面简单记录下ELK结合Redis搭建日志分析平台的集群环境部署过程,大致的架构如下: + Elasticsearch是一个分布式搜索分析引擎,稳定.可水平扩展.易于管理是它的主要设计初衷 + Logstash是一个灵活的数据收集.加工和传输的管道软件 + Kibana是一个数据可视化平台,可以通过将数据转化为酷炫而强大的图像而实现与数据的交互将三者的收集加工,存储分析和可视转化整合在一起就形成了ELK. 基本流程:1)Logstash-Shipper获取日

使用Spring进行统一日志管理 + 统一异常管理

统一日志和异常管理配置好后,SSH项目中,代码以往散落的log.info() 和 try..catch..finally 再也不见踪影! 统一日志异常实现类: [java] view plain copy package com.pilelot.web.util; import org.apache.log4j.Logger; import org.springframework.aop.ThrowsAdvice; import org.springframework.dao.DataAcces

NC外部统一流程管理平台方案

1.前言 NC是用友面向集团企业的世界级高端管理软件,目前NC基于8000家集团企业客户的实力,使其在同类产品市场占有率已经达到亚太第一,面向大型企业集团和成长中的集团企业的信息化需求,用友NC6的产品定位于大型企业管理与电子商务平台.他综合利用最新的互联网技术.云计算技术.移动应用技术等,通过构建大企业私有云来全面满足集团企业管理.全产业链管控和电子商务运营,为集团企业提供了一个全新的支持合规化应用需求和创新需求,以及个性化配置.集成.实施.运维.管理一体化的大型企业管理与电子商务平台,不断帮