大家好,我是泥腿子安尼特。毫不夸张的说,最近这几个月与我相处最久的就是公司里面的ELK系统。
首先,精通一个东西的前提是要精通这个的拼写,ELK = Elasticsearch+Logstash+Kibana。那这个东西有什么用呢,不仅可以帮助你对海量数据完成分布式索引与检索分析还能提供数据聚合分析。下面,本泥腿子
手把手教你搭建一套日志管理分析系统, 如果你已经使用过elk了,会简单使用了,那么可以关闭文章了,下面都是很简单基础的东西。
环境安装
首先吐槽一句,这东西是java写的,就像jetbrain全家桶一样,除了费点内存,其它都非常完美。由于本人还未精通运维这项技能,本文demo全部在mac os下采用docker的方式安装。
准备工作:
拉取镜像:
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.5.0
docker pull docker.elastic.co/kibana/kibana:7.5.0
docker pull docker.elastic.co/logstash/logstash:7.5.0
run镜像:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.5.0
docker run --name kibana --link elasticsearch:elasticsearch -p 5601:5601 -d docker.elastic.co/kibana/kibana:7.5.0
docker run --rm -it --name logstash --link elasticsearch:elasticsearch -v ~/pipeline/:/usr/share/logstash/pipeline/ -v ~/nginx_log:/usr/share/logstash/nginx_log/ docker.elastic.co/logstash/logstash:7.5.0 -d
首先我们运行好elasticsearch的时候我们curl一下localhost:9200 如果有一串json返回,然后我们的搜索引擎elasticsearch就跑起来了。
然后我们在运行kibana 这里加个link的意思就是让kibana跟我另一个容器的elasticsearch相通。run成功之后我们打开浏览器,访问http://127.0.0.1:5601 如果浏览器自动跳到了http://127.0.0.1:5601/app/kibana 那么多半是成功了。如何查看我们es与kibana是否相通呢?选择kibana右侧的:
然后再选择执行GET / 点那个运行图标的小三角 如果出现右侧这样的:
那说明就成了!
完美,就像老王的meshbox一样
最后再run Logstash,运行这个镜像的时候 你可以先不加最后面-d参数。我加了两个目录映射 一个是logstash的配置目录 一个是log的目录。贴上我logstash的配置文件logstash.conf,你们感受一下:
input {
file {
path => ["/usr/share/logstash/nginx_log/access.log"]
codec => json
}
}
output{
elasticsearch { hosts => ["elasticsearch:9200"] index=>"nginx_access_%{+yyyy.MM.dd}" }
}
如果说你最后看到这句话:Successfully started Logstash API endpoint {:port=>9600},
那么恭喜你,成功了。
运行ELK
先来看一张我手绘的架构图
,你们感受一下:
所以流程基本上就明白了,Logstatsh支持文件、Kafka 、Redis、终端输入、TCP等等这些源来收集日志数据,然后传到Elasticsearch集群里,最后我们通过Kibana一个可视化的Web页面来展示。
最简单的就是我们收集nginx_access_log。nginx是支持json形式存log的,所以我在我本机的nginx设置了一个这样的log格式,然后再access_log后面指定这个格式,并把log生成到刚才logstash的配置文件的挂载目录~/nginx_log/下nginx_access_log格式,你们仔细品一下:
log_format log_json '{ "@timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"referer": "$http_referer", '
'"request": "$request", '
'"status": $status, '
'"bytes": $body_bytes_sent, '
'"user_agent": "$http_user_agent", '
'"http_x_forwarded": "$http_x_forwarded_for", '
'"request_time": "$request_time"'
' }';
当然你可以根据需要再多添加点你要的参数,Elasticsearch里不能支持nginx的time_local时间格式,所以这里用time_iso8601。
然后访问你本机nginx起的web站点,然后观察下刚才运行的容器Logstatsh有没有报错,如果没有报错的话,那么我们回到Kibana 点击:
再点击
再点击:
因为我上面的配置指定了日志洗到es那边的index,所以这里输入nginx就能出来了,*表示匹配所有nginx前缀的index:
选择这个字段作为时间筛选的字段:
OK 完美,回到Discover页面,我们就能看到了:
简单使用
综上,我们已经安装并运行好了这套高大上的系统
先别管上面怎么配置,作为一个泥腿子,会用、能用就行!
(补充一点:柱状图那里你可以手动鼠标拖动一个子区间来查看那个时间段的日志)
简单查询举例:
如果你要查询比如response为200的所有请求,你可以在搜索栏输入status:200 。
当然,模糊搜索更是不在话下。比如我们要查询一个包含MicroMessage字段的数据 你可以直接在搜索栏输入"MicroMessage" 。
还有,搜索栏还支持你一些简单与或条件 比如我要查包含AAA并且包含BBB的数据 你可以输入"AAA" AND "BBB" 当然它也是支持OR的。如果遇到有层级关系的,它也是支持括号的,比如 "AAA" AND ("BBB" OR "CCC") 这样取出来就是包含AAA并且包含了BBB或者包含CCC的数据。补充一点,它还能支持非。比如我要查不含有BBB的,用NOT关键词
搜索栏正下方的filter ,可以快速的帮你构建简单的查询语句,如果你精通ES的查询, 那么你也可以手动输入查询dsl语句。
学会了简单的查询,那么我们怎么保存我们的查询以及导出log呢?
简单,那个大大的Save看到了吗?
点save会弹出:
然后点share:
然后我们最后导出的csv文件就在这里可以下载了。
至于我们刚才保存的查询 你既可以在Management里面的Saved Objects里查找 也可以在Recently viewed里面看到。
这一篇就先介绍到这里吧,下一篇我准备,比如es的一些查询啊,比如在kibana上怎么图形化的看更多纬度的信息等。