最近写了一个springcloud的开发脚手架,看日志即使用了链路追踪,在多个服务看日志文件还是有点繁琐,特别是上线了你要跟踪一个已执行的接口,即使上家公司就是这样过来的。虽然听过ELK的大名,但没从没搭建过,就来玩一玩。如果要解决日志查看分析及存储问题,可以去了解一下阿里云的日志服务,在电商公司的时候用过。
1.搭建elasticsearch
1.1 直接执行
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
1.2 在/etc/yum.repos.d目录下添加文件 elasticsearch.repo,添加内容
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
最新的是7.9,我选择6.x版本,因为我不喜欢吃螃蟹。
这步去下载elasticsearch安装包的时候会很卡,玩两把王者荣耀差不多。可以考虑直接使用.tar.gz安装包安装。
官网说的听清楚的。
1.3 开始安装
yum install elasticsearch
1.4 配置一下让外网访问,是否全开放还是指定ip看个人,配置文件在/etc/elasticsearch目录下。修改elasticsearch.yml文件
network.host: 0.0.0.0 //全开放
http.port: 9200 //暴露给外网http的端口, 9300端口是elasticsearch的TCP通讯接口。节点之间的调用。
至于数据保存位置和日志地址,我就默认的,反正能找到就行。
1.5 启动elasticsearch
systemctl start elasticsearch.service //关闭 systemctl stop elasticsearch.service
1.6 测试一下是否成功
curl -X GET "localhost:9200/?pretty"
输出类似则成功:
{
"name" : "6Vd_-6O",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "9Wy_VA8-QqCm2ws4raGAkg",
"version" : {
"number" : "6.8.11",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "00bf386",
"build_date" : "2020-07-09T19:08:08.940669Z",
"build_snapshot" : false,
"lucene_version" : "7.7.3",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
1.7 安装elasticsearch可视化工具,elasticsearch-head。ElasticHD是个页面优美,功能强大的插件,一下标记
使用谷歌插件方式安装,得翻墙,地址:
https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm/
至此。安装完成。
2. 搭建kibana
2.1 这里我使用的是.tar.gz的安装包方式安装,yum下载太慢了,两把王者荣耀下去还不够,不过这个也慢。
下载压缩包包,版本同es一样
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.11-linux-x86_64.tar.gz
2.2 解压压缩包:
tar -xzf kibana-6.8.11-linux-x86_64.tar.gz
2.3 进入安装目录(压缩包的形式安装,配置都在这个目录下)
cd kibana-6.8.11-linux-x86_64/
2.4 在启动之前我们先给它设置一下基本配置
server.port: 9090 //程序启动端口
server.host: "0.0.0.0" //暴露给全外网
elasticsearch.hosts: ["http://localhost:9088"] //es的连接地址,多个在数组,隔开
kibana.index: ".kibana" //kibana使用es的索引
logging.dest: /root/kibana-6.8.11-linux-x86_64/log/kibana.log //设置kibana的输出日
志,我没找到它默认的日志位置在哪
2.5 启动kibana,bin目录下的kibana命令
./bin/kibana //前台启动,ctrl+c就关闭了
nohup ./bin/kibana & //后台启动
2.6 至此,kibana启动成功, http://ip:port 就可以直接访问
kibana一启动es就关闭了?一个小插曲,也就浪费了我3个小时。ES装完请查看你的内存是否足够支持启动kibana。修改ES的启动内存,vim /etc/elasticsearch/jvm.yml 。哎,刚花费我1000多买的一台2核4G的阿里云服务器,还以为暴富了,还不够我研究两个东西。
3. 搭建logstash
3.1 使用.tar.gz安装包形式安装,因为文档中很多是用./bin/logstash方式来演示的
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.11.tar.gz
3.2 解压安装包
tar -xvzf logstash-6.8.11.tar.gz //全部解压到一个文件夹下好管理
3.3 设置启动大小,我的内存不够
cd logstash-6.8.11
vim config/jvm.options
3.4 启动logstash并且测试是否安装成功,具体可参考官网
执行命令: ./bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["127.0.0.1:9088"] } stdout { codec => rubydebug }}'
查看是否成功,如果成功,直接输入 XXX ,默认它会存在一个logstash-*的索引下,可以去es查看。
3.5 至此,logstash安装成功。
4.开始想办法把springboot日志传到logstash中,springboot 集成logstash。
4.1 项目中加入依赖包
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
4.2 logback-spring.xml日志文件中加入:
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:9601</destination> //这个地方的端口要和接下来的logstash配置一样
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<providers> //注意上面这个class类,开始我选择其他类,发现logstash
<timestamp> 一直收不到日志信息,耗了我3个小时检查各种配置。
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
</pattern>
</providers>
</encoder>
</appender>
<Root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="LOGSTASH"/> //放入上面的模块
</Root>
springboot项目集成完毕。
5. 启动logstash来收集springboot日志
5.1 在config目录下新建一个 xxx.conf 文件
vim xxx.conf
输入以下内容:
input {
tcp {
port => 9601
codec => json
}
}
output {
elasticsearch {
hosts => ["localhost:9088"]
index => "springboot-%{+YYYY.MM.dd}" //创建索引,数据将存储在这个索引下
}
stdout { codec => rubydebug } //这个主要在测试的时候可以方便看到输入数据是否是想要的
}
5.2 启动logstash
./bin/logstash -f ./config/xxx.conf
6. 至此,整个流程已经打通了,springboot日志通过tcp发送到logstash,logstash又输出到ES,kibana又连接上了ES,所以整个流程已经通了。下面开始测试。
自己执行一个springboot的一个接口,让它输出日志,然后它会自动保存到ES下的springboot-当日日期索引下,这个索引可以在5.1步骤自行设定。查看ES是否保存成功了,保存成功那么我们就可以去kibana查看了。
进入kibana页面,然后进入左下角管理界面,再进入索引模式,然后创建索引模式,选择刚才的springboot-当日日期索引,可以写成springboot-*形式进行通配,这里其实就是把这个ES索引下的数据引入到kibana。
进入左上角Discover界面,选择刚刚创建的索引模式,然后就可以看到美妙的画面了。