ELK总结

24 篇文章 0 订阅

1、 ELK 简介

ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

Elasticsearch

Elasticsearch是一个基于Lucene的开元分布式搜索服务器,特点为分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等,提供了分布式多用户能力全问搜索服务器,基于RESTful web接口,所有节点的数据是均等的,它是elk的核心。

Logstash

Logstash是一个完全开源的工具,可以对日志进行收集,过滤,分析,并将其存储Elasticsearch里提供使用。

Kibana

Kibana是一个基于浏览器页面的elasticsearch前端展示工具,也是一个开源和免费的工具,kibana可以为logstash和elasticsearch提供日志分析的web展示平台,可以帮助汇总,分析和搜索重要的数据日志。

ELK工作流程

通过logstash收集客户端App的日志数据,将所有的日志过滤 出来,并存入Elasticsearch搜索引擎,然后通过Kibana GUI在web前端展示给用户,最后用户可可以进行查看制定的日志内容,如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYexk6UD-1592879005266)(http://192.168.1.180:8888/group1/M00/00/00/wKgBgF7m_hKAQVmjAABbWoQm6tE637.jpg)]

2、 Elastic Stack

Elastic Stack指的就是ELK Stack。可以看作是ELK的升级版。无论是在混乱如麻的文本型文档中找到前 N 个结果,还是分析安全事件,再或是自由地对指标进行切片和切块,全球社区一直都在使用 ELK 不断地拓展使用范围。于是人们在ELK基础上加入了一系列轻量型的单一功能数据采集器,并把它们叫做 Beats。它更加灵活,可以帮助人们出色完成各项事务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nd9SFayV-1592879005268)(http://192.168.1.180:8888/group1/M00/00/00/wKgBgF7nA0KANxuDAAC3TmB6xCc357.jpg)]

3、 安装部署

ELK版本选择

软件版本备注
JDK1.8on 192.168.1.180
elasticsearch7.2.0on 192.168.1.180
elasticsearch-headlateston 192.168.1.180
kibana7.2.0on 192.168.1.180
logstash5.4.1on 192.168.1.180
filebeat???on 192.168.1.193
kafka???on 192.168.1.180
3.1 ElasticSearch安装
  • docker安装es
docker pull elasticsearch:7.2.0
  • 启动es
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.2.0
  • 修改配置,解决跨域访问问题

首先进入到容器中,然后进入到指定目录修改elasticsearch.yml文件。

docker exec -it elasticsearch /bin/bash
cd /usr/share/elasticsearch/config/
vi elasticsearch.yml
# 追加一下内容,解决跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"
# 重启容器
exit
docker restart elasticsearch
  • 安装ik分词器

es自带的分词器对中文分词不是很友好,所以我们下载开源的IK分词器来解决这个问题。首先进入到plugins目录中下载分词器,下载完成后然后解压,再重启es即可。具体步骤如下:
注意:elasticsearch的版本和ik分词器的版本需要保持一致,不然在重启的时候会失败。可以在这查看所有版本,选择合适自己版本的右键复制链接地址即可。

cd /usr/share/elasticsearch/plugins/
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip
exit
docker restart elasticsearch 然后可以在kibana界面的dev tools中验证是否安装成功;

  • 验证
POST test/_analyze
{
  "analyzer": "ik_max_word",
  "text": "你好世界kkaka"
}

不添加"analyzer": “ik_max_word”, 默认是每个字分词,可以在kibana安装完成以后尝试一下。

3.2 Kibana安装
  • docker安装Kibana
docker pull kibana:7.2.0
  • 启动kibana

安装完成以后需要启动kibana容器,使用–link连接到elasticsearch容器,命令如下:

docker run --name kibana --link=elasticsearch:test  -p 5601:5601 -d kibana:7.2.0
docker start kibana

启动以后可以打开浏览器输入http://192.168.1.180:5601就可以打开kibana的界面了。

  • Kibana汉化

从6.7版本开始,Kibana支持中文,无需再像之前那样下载汉化包,甚至自己进行翻译。

# 进入kibana容器
docker exec -it 容器id /bin/bash

打开Kibana解压目录下的 config/kibana.yml文件,找到下面这一行, 将en改成zh-CN, 退出容器,重启容器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HsJOa3IV-1592879005270)(http://192.168.1.180:8888/group1/M00/00/00/wKgBgF7nDDmAIWFvAACnu_iXdjA048.jpg)]

浏览器输入http://192.168.1.180:5601即可看见效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UyWyrSa3-1592879005272)(http://192.168.1.180:8888/group1/M00/00/00/wKgBgF7nDUCAKZ6TAAKryzyHxq0916.jpg)]

3.3 Elasticsearch-head 安装

Head是elasticsearch的集群管理工具,可以用于数据的浏览和查询。
elasticsearch-head是一款开源软件,被托管在github上面,所以如果我们要使用它,必须先安装git,通过git获取elasticsearch-head
运行elasticsearch-head会用到grunt,而grunt需要npm包管理器,所以nodejs是必须要安装的。

建议使用cnpm,npm耗费了大量的时间。

cd /usr/local
# 下拉代码
git clone https://github.com/mobz/elasticsearch-head.git
# 安装依赖
yum -y install bzip2.x86_64

  • 安装 grunt
npm install -g grunt-cli

  • install
cd elasticsearch-head

npm install --unsafe-perm

  • Gruntfile.js修改配置
vi Gruntfile.js

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FOu7LzKd-1592879005273)(http://192.168.1.180:8888/group1/M00/00/00/wKgBgF7nGyaAa7BkAAA_kcwOhck565.jpg)]

Elasticsearch Head 数据浏览 浏览器控制台报406

解决方法

1、进入 Elasticsearch Head 安装目录;
2、cd _site/
3、编辑 vendor.js 共有两处
将 6886行 contentType: "application/x-www-form-urlencoded" 修改为 contentType: "application/json;charset=UTF-8"
再将 7574行 var inspectData = s.contentType === "application/x-www-form-urlencoded" && 修改为 var inspectData = s.contentType === "application/json;charset=UTF-8" &&
4、重启Elasticsearch Head

  • 启动 elasticsearch-head

nohup ./node_modules/grunt/bin/grunt server &

浏览器访问 http://192.168.1.180:9100/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tUQUXQ9y-1592879005275)(http://192.168.1.180:8888/group1/M00/00/00/wKgBgF7nHXuAOr5gAALrUXojE0A981.jpg)]

3.4 Logstash 安装

这里用logstash只需下载解压就能使用,这里作测试,连接mysql,导入mysql表中的数据。

# 这个版本的logstash支持引入mysql数据
tar -zvxf logstash-5.4.1.tar.gz
# 进入目录
cd logstash-5.4.1
# 在config目录下创建配置文件, 文件名任意, 用于logstash启动时当参数传入
cd config
vim device_info.conf

device_info.conf内容如下:

# 这里的备注方便阅读, 复制操作的时候请把备注删除,并作相应修改
input {
    jdbc {
        # 下载mysql驱动,所在路径以及版本
        jdbc_driver_library => "/路径/mysql-connector-java-5.1.32.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        # 数据库ip
        jdbc_connection_string => "jdbc:mysql://ip:3306/数据库名"
        jdbc_user => "账号"
        jdbc_password => "密码"
        # sql参数
        parameters => { "del" => 0 }
        # sql语句
        statement => "SELECT * FROM device_info  WHERE del = :del"
    }

}

filter {
        mutate {
                rename => {
                "longitude" => "[location][lon]"
                "latitude" => "[location][lat]"
                }
        }
}

output {

        elasticsearch {
                # es索引
                index => "mysql_device"
                # es主机地址
                hosts => "192.168.1.180:9200"
                # es索引中type
                document_type => "device"
        }
}


保存退出, 后台启动logstash

nohup ../bin/logstash -f ./device_info.conf &

可以查看nohup.out日志文件输出tail -f nohup.out

看效果可以从es-head查看, 也可以从kibana中查看

  • kibana中效果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QUtXJWws-1592879005277)(http://192.168.1.180:8888/group1/M00/00/00/wKgBgF7nJcmAGk5lAANeOj6OG48503.jpg)]

  • es-head中效果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JerBjUe1-1592879005279)(http://192.168.1.180:8888/group1/M00/00/00/wKgBgF7nJbSAC1lLAAMJUkig–s896.jpg)]

3.5 Filebeat安装

略…

4、 Grok语法

查看地址:https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
grok debbuger:使用kibana中自带的工具(个人偏好)
推荐学习网站: https://ngx.hk

USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})
BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b

POSINT \b(?:[1-9][0-9]*)\b
NONNEGINT \b(?:[0-9]+)\b
WORD \b\w+\b
NOTSPACE \S+
SPACE \s*
DATA .*?
GREEDYDATA .*
QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``))
UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}

# Networking
MAC (?:%{CISCOMAC}|%{WINDOWSMAC}|%{COMMONMAC})
CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4})
WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2})
COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2})
IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?
IPV4 (?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])
IP (?:%{IPV6}|%{IPV4})
HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)
HOST %{HOSTNAME}
IPORHOST (?:%{HOSTNAME}|%{IP})
HOSTPORT %{IPORHOST}:%{POSINT}

# paths
PATH (?:%{UNIXPATH}|%{WINPATH})
UNIXPATH (?>/(?>[\w_%!$@:.,-]+|\\.)*)+
TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+))
WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+
URIPROTO [A-Za-z]+(\+[A-Za-z+]+)?
URIHOST %{IPORHOST}(?::%{POSINT:port})?
# uripath comes loosely from RFC1738, but mostly from what Firefox
# doesn't turn into %XX
URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+
#URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)?
URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?
URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?

# Months: January, Feb, 3, 03, 12, December
MONTH \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b
MONTHNUM (?:0?[1-9]|1[0-2])
MONTHNUM2 (?:0[1-9]|1[0-2])
MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])

# Days: Monday, Tue, Thu, etc...
DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?)

# Years?
YEAR (?>\d\d){1,2}
HOUR (?:2[0123]|[01]?[0-9])
MINUTE (?:[0-5][0-9])
# '60' is a leap second in most time standards and thus is valid.
SECOND (?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)
TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9])
# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE}))
ISO8601_SECOND (?:%{SECOND}|60)
TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
DATE %{DATE_US}|%{DATE_EU}
DATESTAMP %{DATE}[- ]%{TIME}
TZ (?:[PMCE][SD]T|UTC)
DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}
DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE}
DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}
DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND}

# Syslog Dates: Month Day HH:MM:SS
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
PROG (?:[\w._/%-]+)
SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])?
SYSLOGHOST %{IPORHOST}
SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}>
HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}

# Shortcuts
QS %{QUOTEDSTRING}

# Log formats
SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)
COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}

# Log Levels
LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
4.1栗子
nginx日志
192.168.1.80 - - [23/Jun/2020:09:13:35 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3756.400 QQBrowser/10.5.4039.400"
Grok 模式
%{IPORHOST:client_ip} - (%{GREEDYDATA:auth}|-) \[%{HTTPDATE:timestamp}\] \"(%{WORD:verb} %{NOTSPACE:request} HTTP/%{NUMBER:http_version}|%{GREEDYDATA:request})\" (%{IPORHOST:domain}|%{URIHOST:domain}|-) %{NUMBER:response} %{QS:referrer} %{QS:other}

解析结果如图:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值