当前位置: 首页 > 科技观察

本文带你搭建一套ELKStack日志平台

时间:2023-03-18 01:07:23 科技观察

前言最近一直在折腾ELK日志平台,ELK日志平台是Elastic推出的一整套日志采集、分析、展示解决方案。我做了很多练习。这个东西看着简单,但是里面的流程步骤还是很多的,遇到了很多坑。在此记录总结。本文亮点:一步一个脚印,结合实际案例,踩坑记录,结合开发环境日志,反映真实日志场景。日志采集平台的组合有很多种:ELKStack方式:Elasticsearch+Logstash+Filebeat+Kibana,业界最常见的架构。Elasticsearch+Logstash+Kafka+Kibana使用的是消息中间件,但是里面也有很多坑,下讲会讲到。这次先来讲解一下ELKStack的方法,它对我们的代码是无侵入的。核心思想是收集磁盘的日志文件,然后导入到Elasticsearch中。比如我们的应用系统通过logback将日志写入磁盘文件,然后通过这套组合的中间件,可以收集日志供我们查询。整体架构图如下:流程如下:首先使用Filebeat收集日志,然后将数据传输到Logstash。通过Logstash强大的数据清洗功能。最后将数据写入Elasticsearch。并由Kibana可视化。温馨提示:以下案例都是在分配了6G内存的ubuntu虚拟机上完成的。1、部署Elasticsearch数据库获取elasticsearch镜像:dockerpullelasticsearch:7.7.1创建挂载目录:mkdir-p/data/elk/es/{config,data,logs}授予权限:chown-R1000:1000/data/elk/es创建配置文件:cd/data/elk/es/configtouchelasticsearch.yml----------------------配置内容--------------------------------cluster.name:"my-es"network.host:0.0.0.0http.端口:9200启动弹性搜索容器:dockerrun-it-d-p9200:9200-p9300:9300--namees-eES_JAVA_OPTS="-Xms1g-Xmx1g"-e"discovery.type=single-node"--重新启动=总是-v/data/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml-v/data/elk/es/data:/usr/share/elasticsearch/data-v/data/elk/es/logs:/usr/share/elasticsearch/logselasticsearch:7.7.1验证elasticsearch是否启动成功:curlhttp://localhost:92002.部署Kibana可视化工具2.1安装Kibana获取kibana图片:dockerpullkibana:7.7.1获取elasticsearch容器ip:dockerinspect--format'{{.NetworkSettings.IPAddress}}'esresult:172.17.0.2;创建kibana配置文件:mkdir-p/data/elk/kibana/vim/data/elk/kibana/kibana.yml配置内容:#docker的默认Kibana配置targetserver.name:kibanaserver.host:"0"elasticsearch.hosts:["http://172.17.0.2:9200"]xpack.monitoring.ui.container.elasticsearch.enabled:true2.2runkibanadockerrun-d--restart=always--log-driverjson-file--log-optmax-size=100m--log-optmax-file=2--namekibana-p5601:5601-v/data/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.ymlkibana:7.7.1访问http://192.168.56.10:5601这个IP是服务器IP。Kibana控制台界面如下图所示。当你打开kibana的时候,首页会提示你选择添加一些测试数据。单击尝试我们的示例数据按钮。Kibana界面会提示是否导入示例数据。选择好后,Kibana会自动帮你导入,然后你就可以进入Discover窗口搜索日志了。image-202204271616452703.部署logstash日志过滤和转换工具3.1安装JavaJDK$sudoaptinstallopenjdk-8-jdk修改/etc/profile文件:sudovim/etc/profile在.profile文件中添加如下内容:#JAVAJAVA_HOME="/usr/lib/jdk/jdk-12"PATH="$PATH:$JAVA_HOME/bin"在命令行输入如下命令:source/etc/profile查看java是否配置成功:java-version3.2安装logstash下载logstash安装包:curl-L-Ohttps://artifacts.elastic.co/downloads/logstash/logstash-7.7.1.tar.gz解压安装:tar-xzvflogstash-7.7.1。tar.gz要测试您的Logstash安装,请运行最基本的Logstash管道。例如:cdlogstash-7.7.1bin/logstash-e'input{stdin{}}output{stdout{}}'Logstash启动完成后,我们在stdin中输入如下文本,可以看到如下输出:当我们输入一行字符回车,我们马上可以在stdout上看到输出信息。如果我们能看到这个输出,我们的Logstash安装就成功了。我们进入Logstash安装目录,修改config/logstash.yml文件。我们将config.reload.automatic设置为true。另一种运行Logstash的方式,也是最常见的方式,就是在运行时指定logstash的配置文件。3.3配置logstashLogstash配置文件有两个必需元素,输入(inputs)和输出(ouputs),以及一个可选元素filters。输入插件配置源数据,过滤插件根据您的指定修改数据,输出插件将数据写入目标。我们首先需要创建一个配置文件,配置内容如下图所示:创建kibana配置文件weblog.conf:mkdir-p/logstash-7.7.1/streamconfvim/logstash-7.7.1/streamconf/weblog.conf配置内容如下:input{tcp{port=>9900}}filter{grok{match=>{"message"=>"%{COMBINEDAPACHELOG}"}}mutate{convert=>{"bytes"=>"整数"}}geoip{source=>"clientip"}useragent{source=>"agent"target=>"useragent"}date{match=>["timestamp","dd/MMM/yyyy:HH:mm:ssZ"]}}output{stdout{}elasticsearch{hosts=>["localhost:9200"]}}上面我们同时保留两个输出:stdout和elasticsearch。事实上,我们可以定义很多输出。stdout输出对我们的初始调试非常有帮助。当我们完善了所有的调试之后,我们就可以关闭上面的stdout输出了。更新此配置文件后,我们在另一个控制台中发送第一条日志:head-n1weblog-sample.log|nclocalhost9900这条命令的意思是:我们使用nc应用读取第一行数据,然后发送到TCP端口号9900,看控制台输出。这里的weblog-sample.log是样例数据,内容如下,放在本地作为日志文件。14.49.42.25--[12/May/2019:01:24:44+0000]"GET/articles/ppp-over-ssh/HTTP/1.1"20018586"-""Mozilla/5.0(Windows;U;WindowsNT6.1;en-US;rv:1.9.2b1)Gecko/20091014Firefox/3.6b1GTB5》logstash控制台打印出weblog-samle.log中的内容:这次我们打开Kibana,执行命令,成功看到这个记录在es。GETlogstash/_search4.部署Filebeat日志收集工具4.1安装Filebeatcurl-L-Ohttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.1-linux-x86_64.tar.gztarxzvffilebeat-7.7.1-linux-x86_64.tar.gz注:由于ELK迭代速度较快,我们可以将上面的7.7.1版本替换成自己需要的版本。我们先不要运行Filebeat。4.2配置Filebeat我们可以在Filebeat安装目录下创建这样一个filebeat_apache.yml文件。其内容如下。首先让filebeat直接将日志文件导入elasticsearch,确认filebeat是否正常工作。filebeat.inputs:-type:logenabled:truepaths:-/home/vagrant/logs/*.logoutput.elasticsearch:hosts:["192.168.56.10:9200"]paths对应你的日志文件夹路径,我配置了它是这样的:/home/vagrant/logs/*.log,之前配置为/home/vagrant/logs无法正常采集。此外,这里可以放置多个日志路径。4.3测试使用Filebeat时,需要先启动Logstash,再启动Filebeat。bin/logstash-fweblog.conf然后,再次运行Filebeat,-c表示运行指定的配置文件,这里是filebeat_apache.yml。./filebeat-e-cfilebeat_apache.yml运行结果如下,一定要确认控制台是否打印了指定的日志,用于加载和监控。如下图,监控到三个日志文件:error.log,info.log,debug.log我们可以使用这个命令查看filebeat日志是否导入成功:curlhttp://localhost:9200/_cat/indices?v命令将查询Elasticsearch中的所有索引。如下图,filebeat-7.7.1-*索引创建成功。因为我没有配置索引的名字,这个索引的名字就是默认的。在kibana中搜索日志,可以看到导入的错误日志。但是我们必须在kibana中创建一个filebeat索引(点击createindexpattern按钮,然后输入filebeat关键字来添加这个索引),然后我们就可以在kibana的Discover控制台中查询日志了。创建query索引搜索日志4.4Filebeat+Logstash接下来我们配置filebeat收集日志输出到logstash,再由logstash转换数据输出到elasticsearch。filebeat.inputs:-type:logenabled:truepaths:-/home/vagrant/logs/*.logoutput.logstash:hosts:["localhost:9900"]修改logstash配置文件:vim/logstash-7.7.1/streamconf/weblog.conf将输入配置为节拍,并修改用户代理:input{beats{port=>"9900"}}filter{grok{match=>{"message"=>"%{COMBINEDAPACHELOG}"}}mutate{convert=>{"bytes"=>"integer"}}geoip{source=>"clientip"}useragent{source=>"user_agent"target=>"useragent"}date{match=>["timestamp","dd/MMM/yyyy:HH:mm:ssZ"]}}output{stdout{codec=>dots{}}elasticsearch{hosts=>["192.168.56.10:9200"]index=>"apache_elastic_example"}}然后重新启动logstash和filebeat。有一个问题。这次启动filebeat时,只检测到一个info.log文件,没有检测到error.log和debug.log,所以只导入了info.log到Elasticsearch中。filebeat只监测了info.log文件logstash输出结果如下,会有格式化日志:在Kibanadevtools中可以看到索引apache_elastic_example,说明索引创建成功,日志也导入elasticsearch。另外注意logstash中的grokfilter。指定消息的格式需要和自己日志的格式匹配,这样我们的日志内容才能正确映射到消息字段。比如我的logback配置信息如下:logbackconfiguration而我的logstash配置如下,和logback的pettern是一致的。grok{match=>{"message"=>"%d{yyyy-MM-ddHH:mm:ss}[%thread]%-5level%logger-%msg%n"}}然后我们可以在es中看到日志文件中的信息。如下图所示:至此,Elasticsearch+Logstash+Kibana+Filebeat部署成功,可以愉快的查询日志了~后续升级计划:添加Kafka。加上Grafana监控。链接跟踪。5.遇到的问题及解决方法5.1Failedtopullkibanaimagefailedtoregisterlayer:Errorprocessingtarfile(exitstatus2):fatalerror:runtime:outofmemory原因是inodes资源耗尽,清理一下即可:df-isudo查找。-xdev-类型f|切-d"/"-f2|排序|uniq-c|排序-ncurl-shttps://raw.githubusercontent.com/ZZROTDesign/docker-clean/v2。0.4/docker-clean|sudotee/usr/local/bin/docker-clean>/dev/null&&\sudochmod+x/usr/local/bin/docker-cleandocker-clean5.2pullkibanaimagefaileddockerpullruntime:内存不足会增加虚拟机的内存大小。5.3Kibana无法启动“LicenseinformationcouldnotbegettingfromElasticsearchduetoError:NoLivingconnectionserror”}检查配置的IP地址是否为容器的IP。参考链接:https://blog.csdn.net/UbuntuTouch/article/details/105973985https://blog.csdn.net/UbuntuTouch/article/details/105979677https://blog.csdn.net/yuemancanyang/article/details/122769308https://elasticstack.blog.csdn.net/article/details/105922198https://www.jianshu.com/p/8239d32f19e6