序言
公司新起的项目从什么都没有开始搭建,遇到了很多形形色色的问题,花费了不少时间去一个个解决,不过也从中学习到了很多之前没有机会去深入了解的东西,想明白了很多以前没想明白的事情,在这期间也尝试了很多种不同的问题解决方案。因为我本身也不算什么技术大佬,在解决问题的过程中难免会被一些可能大佬并不会觉得很难的问题困扰,有些问题的解决方案可能也很简单,但在这个过程中还是走了不少弯路,希望能在未来的时间里将一些遇到的问题记录一下,也算是对自己工作的一个复盘,如果能帮到被同样问题困扰的同学那自然是最好的了。
因为我本身对一些官方文档的理解可能是偏弱一些,很多可能官方认为没有必要写得太详细的内容我需要花费很多时间去理解,而且网上很多资料在介绍的时候都是以复制粘贴为主,很多步骤被缩略的很严重,往往需要看好几篇同类型的文章才能把一个步骤搞懂,所以这篇文章的目的是希望能够帮助一些和我一样刚接触ELK的同学能够在跟着步骤一步一步一起操作能够做到把这个东西在本地环境用起来。当然,如果文章中有什么写得不对的地方也欢迎在评论区指正,谢谢各位了。
一、ELK介绍
既然你会点进这篇文章,说明你是对ELK有一定了解并且希望能够使用的,不过在这里我还是想简单聊一下我对ELK的理解。
E是指elastic,是一个文本搜索引擎,很多有名的网站比如stack overflow等都有在使用,主要起到对日志文件的搜索和分析。
L是指logstash,是一个日志流处理工具,主要作用是将日志转换为需要的格式,方便搜索。
K是指kibana,是一个可视化软件,elastic搜索到的数据会在kibana展示出来或者转换成对应的图表方便查看。
这三个工具为了避免使用时遇到奇奇怪怪的问题,最好均使用同一个版本,本次示例使用的版本是8.4.1
二、Elastic
在正式使用elastic之前,官方说法是需要先提前安装好JDK环境,但是由于我本机是有JDK的,不太清楚如果不安装的话会有什么后果,因为在启动日志里,显示使用的是elastic自带的JDK文件,不过保险起见,你最好能有一个JDK环境。
如果不知道怎么安装JDK的话,可以参考 菜鸟教程
elastic的安装过程非常简单,打开 安装地址,下载文件包,解压缩,就好了
配置方面由于elastic很好的支持了开箱即用,大多数配置都是可以直接用默认值的,其中有两个配置可以检查一下:
http.host: 0.0.0.0
network.host: 0.0.0.0
这两个配置用于后续链接logstash和kibana,允许其他地址访问的,如果是本机上使用可以填localhost就行,如果是docker可能需要将配置改成0.0.0.0。
启动elastic的方法也很简单,直接在当前目录下执行./bin/elasticsearch或者.\bin\elasticsearch.bat(windows)。如果你想把elastic作为一个守护进程在后台运行,那么可以在后面添加参数 -d 。
测试elastic是否已经启动成功,可以在浏览器打开localhost:9200,如果浏览器没有正常返回数据,可能是因为elastic默认设置了ssl访问,尝试一下https://localhost:9200,详情参考下面的问题集合1
在这里必须要提一下elastic用户名密码的问题,因为下面的kibana要用。
elastic内置有几个用户,分别是elastic, kibana, logstash_system,beats_system,由于下面的kibana使用的是token的方式来连接(可以直接按照elastic指定的方式连接,没有麻烦的ssl校验问题),这里只需要了解elastic这一个用户就行。
使用bin/elasticsearch-setup-passwords命令重置默认用户的密码,有两个参数,分别是interactive 手动设置, auto 自动生成密码,建议使用自动生成密码(生成好的密码注意保存),下面是参考命令:./bin/elasticsearch-reset-password -u elastic -auto
生成好的密码请注意保存,后面需要使用。
三、Logstash
Logstash的下载也同样简单,下载系统对应的版本,解压,进入logstash根目录,执行.\bin\logstash.bat -f C:\Users\admin\Downloads\logstash-8.4.1-windows-x86_64\logstash-8.4.1\config\logstash-sample.conf(windows),其中-f后接的内容是你需要logstash执行的配置文件所在位置,注意替换成自己的文件位置。
下面是我的配置信息,也算是经过多次失败之后总结出来的:
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
#读取log文件
input{
stdin {} #这一条很关键,具体原因在问题解决中会提到
file{
#设置log文件路径,多个文件路径可设置成数组[],模糊匹配用*
#指定单一文件
path => ["C:\Users\admin\Downloads\logs\logs.log"]
#指定数组文件
#path => ["/data/es/logstash-5.6.1/files/test-1.log","/data/es/logstash-5.6.1/files/test-2.log"]
#指定同级目录模糊匹配
#path => "/data/es/logstash-5.6.1/files/test*.log"
#指定多级目录模糊匹配
#path => "/data/es/logstash-5.6.1/files/**/test*.log"
#可设置成begining或end,begining表示从头开始读取文件,end表示读取最新数据,可和ignore_older一起使用
#begining只针对首次启动是否需要读取所有的历史数据,而当文件修改了之后,同样会自动增量更新新数据
start_position =>"beginning"
#设置输入规则
#codec => multiline {
#利用正则匹配规则,匹配每一行开始的位置,这里匹配每一行开始的位置为数字
#pattern => "^[0-9]"
#true表示不匹配正则表达式,false为匹配正则表达式,默认false
#如果不匹配,则会结合what参数,进行合并操作
#negate => true
#what可设置previous和next,previous则表示将所有不匹配的数据都合并到上一个正则事件
#而next则相反,将所有的不匹配的数据都合并到下一个正则事件
#what => "previous"
#表示当多长时间没有新的数据,最后一个正则匹配积累的多行数据都归属为最后一个事件,这里的10表示10秒
#auto_flush_interval => 10
#}
#当存在多个文件的时候可使用type指定输入输出路径
type=>"syslog"
}
}
#输出log文件
output{
#输出控制台
#stdout {
#codec => json
#}
#输出到es
elasticsearch{
hosts=>["https://localhost:9200"]
#以当前的日期作为index和type
index=>"syslog-test"
user => "elastic"
password => "4+d59b9n+I4gYtqEWBKn"
#你的SSL证书地址
cacert => "C:\Users\admin\Downloads\elasticsearch-8.4.1-windows-x86_64\elasticsearch-8.4.1\config\certs\http_ca.crt"
#覆盖模板,不需要可注释掉,通用模板下载:https://download.csdn.net/download/alan_liuyue/11241484
#template_overwrite=>true
#template=>"/data/es/logstash-5.6.1/template/logstash.json"
}
}
四、kibana
kibana的下载还是同样简单,按照环境的不同区分为 Linux和 windows,下载后直接运行就好了。
运行完后打开浏览器,访问localhost:5601,可以看到kibana的初始化页面,如果你不喜欢英文的话,可以在config文件夹下的kibana.yml文件中加上i18n.locale: "zh-CN"切换中文
其他的配置不建议手动修改,因为kibana已经提供了非常便利的配置方法
初次访问该地址的时候会提示填入令牌
这个令牌可以在elastic目录下执行bin\elasticsearch-create-enrollment-token.bat --scope kibana命令获得,需要注意的是,执行这个命令前注意elastic是否处于运行状态。
执行完成后,将获得的令牌粘贴进去。
就会得到一个验证框,将cmd中显示的验证码复制进去,就得到了一个登录页面。
将之前在elastic中获取到的用户名密码输入进去,就可以正常使用了。
打开侧边栏,选择discover
这里很多文章都会告诉你已经可以直接看到你导入的数据源了,但实际上并没有。比如这篇:
我第一次看到的时候也是一脸懵逼,怎么的连界面都不一样的?
但是先别慌。
选择数据视图,点击创建数据视图。
在索引模式里填上你之前在logstash里填写的索引
还没打完就会给出提示(如果没给出提示,参考一下遇到的问题集合4),名称就随便填一个好了,这里我填的是测试日志
填写完后就可以在kinbana里看到了
但是,你可能还是和我一样找不到日志内容,控制台白茫茫一片
还是不要慌,检查一下右上角匹配的时间是不是在你日志的时间范围内
很不巧,我的日志是在elastic官网下载的日志模板,都是一些2015年的老日志了。
不过没有关系,2015年也可以调。
点击refresh就能看到了。
欢迎来到elastic~~
遇到的问题集合
1. Logstash连接不上elastic
在准备好kibana、elastic之后,你有一定概率会遇到logstash启动成功了但是连接不上elastic的情况,我遇到的报错主要分两种:
Attempted to resurrect connection to dead ES instance, but got an error {:url=>"http://127.0.0.1:9200/", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :message=>"Elasticsearch Unreachable: [http://127.0.0.1:9200/][Manticore::ClientProtocolException] 127.0.0.1:9200 failed to respond"}
同时,在elastic的控制台可以看到同步出现报错:
http client did not trust this server's certificate, closing connection Netty4HttpChannel{localAddress=/[0:0:0:0:0:0:0:1]:9200, remoteAddress=/[0:0:0:0:0:0:0:1]:52780}
这个报错的原因是你的elastic启用了https监听9200端口,而你的logstash使用的是http请求9200,验证方式也很简单:
在浏览器输入http://localhost:9200 你会得到以下页面
而在浏览器输入https://localhost:9200 你会得到以下页面:
这时候,你可能会想,把http端口直接改成https不就能请求到了吗。
如果这么做了,那么恭喜你,你将得到一个新的报错:
Attempted to resurrect connection to dead ES instance, but got an error {:url=>"https://localhost:9200/", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :message=>"Elasticsearch Unreachable: [https://localhost:9200/][Manticore::ClientProtocolException] PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"}
和刚才的报错很像,但是报错信息不一样,这次的报错翻译过来叫:
无法找到请求目标的有效证书路径
到这里,我的第一反应是算了要不就不用校验了吧,怪麻烦的,于是乎去翻文档,发现有 这么一条
晴天霹雳,这是要把我架在火上烤啊。既然这样,那也只能硬着头皮上了。
本来是这么想的,但实际操作一下发现其实挺简单。
如果你是和我一样的小倒霉蛋的话,检查一下你的elastic/config/certs 目录下会有三个自动生成的密钥文件
那么你只需要把这三个文件复制一下,放到Logstash的本地目录下(当然,你直接用elastic的目录也不是不可以)
修改配置(注意填上用户名密码,本地证书路径指的是http_ca.crt文件的路径,不是文件夹路径)
修改完后你就可以看到logstash启动成功,elastic收到了请求
如果你是个更倒霉的倒霉蛋,elastic里没有默认证书,那么:
里面需要填写dns和ip,就填localhost好了。
2.想使用elastic-head却连接不上elastic
先检查一下elastic-header文件夹里有一个Gruntfile.js文件,找到文件里的connect配置项,将host改为0.0.0.0
connect: {
server: {
options: {
hostname: '0.0.0.0',
port: 9100,
base: '.',
keepalive: true
}
}
}
再检查elastic config文件夹下的 elasticsearch.yml文件是否允许插件访问
# elasticsearch-head 插件访问
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: Authorization,content-type
在elastic-head存放目录下执行 npm run start (在这之前要执行 npm install 这个应该不用说吧)
最后如果你有设置elastic的密码,再使用elastic-header时需要注意链接需要加上你的用户名密码:
http://localhost:9100/?auth_user=elastic&auth_password=123456
3.elastic报错:org.elasticsearch.ElasticsearchException: not all primary shards of [.geoip_databases] index are active
在配置文件elasticsearch.yml中添加配置项ingest.geoip.downloader.enabled: false,禁用geoip搜索。
4.logstash连接elastic成功但在kibana上找不到配置的索引
说来惭愧,这个问题我研究了整整一天半,什么都是按照教程上配置的,但就是没有成功。因为我不是像大多数参考那样去通过监听一个端口来获取日志,我希望能够在我的项目输出日志之后通过读取日志文件的方式来记录日志(日志文件有专门的过期处理,如果放在数据库里的话反而不好弄),相当于是做另一份准备,如果kinaba出问题的话还能通过手动读取文件的方式来获取日志信息。
在仔细检查过logstash的启动信息之后,发现虽然启动成功了,但是在启动日志里有一条错误信息:
大致意思是:没有设置 sincedb_path,根据“路径”设置生成一个。
让人很疑惑啊,不知道是什么鬼问题,但是我查询了elastic的论坛,发现确实也有其他人遇到了和我一样的问题,当时有人给出的解答是:
翻译过来就是:不要在文件输入的路径选项中使用反斜杠——使用正斜杠。
嗯?还有这种事?吓得我赶紧把文件路径改了一下,发现并不是这个问题。
然后我又仔细看了一下论坛里的其他人发言,发现在被折叠的楼层里有这么一条:
于是就有了前文的那个注释。
5.elastic 在linux上报错: can not run elasticsearch as root
因为在es5之后的都不能使用添加启动参数或者修改配置文件等方法启动了,必须要创建用户。
创建用户:adduser elastic 这里会要求你输入密码,要输入两次,请把密码记住
将对应的文件夹权限赋给该用户:chown -R elastic /elk/elasticsearch-8.4.1(你的elastic解压地址)
切换至elasticsearch用户:su elastic
后台启动:./elasticsearch -d
顺便: kibana后台启动命令:nohup /elk/kibana-8.4.1/bin/kibana &
查看kibana后台启动日志 tail -f ./bin/nohup.out