开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
ELK了解
ELK是Elasticsearch、Logstash、Kibana三者的简称,其中Elasticsearch是一个很牛逼的分布式数据存储、搜索引擎;Logstash是一个数据数据的二道贩子,能从各种渠道收集数据,然后处理,再转手送到elasticsearch或者其余数据存储中心;kibana是一个数据展示中心。三者结合下就可以实现将各个应用的日志都集中到一起,非常方便在生产环境中分析日志,帮助排查问题(估计是的,作为一个小开发,表示没经历过。。。)。
Docker方式部署单机环境
elk是可以进行集群部署的,但是一般的开发环境,甚至是一些数据量不大的系统,单机环境足矣。
这里我的版本选择的是7.15.2,是在spring官网中的spring data中看到spring与Elasticsearch是有集成支持的,所以就根据用的spring boot以及spring的版本选择了一个版本。版本上区别较大的应该是8.x与7.x之间,8.x默认开启了数据安全策略,区别较大。如果你的版本选择的是8.x,就需要需要去了解8.x版本的部署方式。
Windows环境下的部署可参考:Windows部署ELK监控spring boot日志开发环境搭建
部署Elasticsearch
-
拉取镜像elasticsearch镜像 docker官方镜像网站hub.docker.com/ 没有7.15.2版本,所以直接执行
docker pull elasticsearch:7.15.2无法成功拉取,需要去elastic stack官方提供的镜像网址拉取。docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2 -
创建docker网络,取名elk(名字随意),用于elasticsearch、logstash、kibana之间的通信
docker network create elk -
运行elasticsearch容器,暴露端口9200、9300,使用网络elk,single-node discovery ,该发现允许绕过单节点开发集群中的 bootstrap checks 检查。
docker run -d --name elasticsearch --net elk -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.15.2然后访问部署电脑的9200端口,出现如下图所示代表部署成功:
部署Kibana
-
拉取kibana镜像
docker pull docker.elastic.co/kibana/kibana:7.15.2 -
运行kibana容器,使用上面创建的elk网络,暴露端口5601,
ELASTICSEARCH_HOSTS是设置连接到同一网络的elasticsearch容器的9200端口,I18N_LOCALE是国际化语言设置,这里设置成中文。docker run -d --name kibana --net elk -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" -e "I18N_LOCALE=zh-CN" docker.elastic.co/kibana/kibana:7.15.2访问
http://localhost:5601(不在本机部署的就是具体的localhost就换成具体IP)出现下图所示界面代表启动成功:
部署Logstash
-
拉取镜像
docker pull docker.elastic.co/logstash/logstash:7.15.2 -
准备相关配置文件
logstash启动时必须指定一个pipeline的配置,不理解可以直接理解成得指定一个包含input、filter(可选) 、output的配置,在Windows或者Linux下我们可以在执行启动命令时以参数的形式携带,但是在docker里面,我们就需要提前准备好配置文件,让容器启动的时候自己能找到。
在%HOME%目录下创建一个
elk/logstash文件夹,用户存放相关配置文件(base) spy@LAPTOP-S33NVIQ3:~/elk$ tree . └── logstash ├── logstash.yml └── myconf └── my-logstash.conf 2 directories, 2 fileslogstash.yml:
logstash的配置文件,logstash在启动时会加载这个文件里面的配置选项,在这里面配置了配置文件的路径,logstash默认的配置文件存放在
/usr/share/logstash/config下的,为了不影响到它原本的配置,在与它同级的目录下创建了一个myconf来存放我们自己的配置。path.config: /usr/share/logstash/myconf/*.confmy-logstash.conf:
配置内容:在input中定义了两个插件,一个tcp的4560端口,一个是控制台的标准输入;在output中配置了elasticsearch的地址,以及推送到elasticsearch中的哪个索引,索引不存在会进行创建,以及控制台的标准输出。
input { tcp { port => 4560 codec => json_lines ssl_enable => false } stdin{ } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] index => "dtaf-%{+YYYY.MM.dd}" } stdout{ codec=>rubydebug } } -
运行容器
为了方便观察启动是否成功,可以先取消-d选项。
docker -d run --name logstash --net elk -p 4560:4560 -v /home/spy/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml -v /home/spy/elk/logstash/myconf/my-logstash.conf:/usr/share/logstash/myconf/my-logstash.conf docker.elastic.co/logstash/logstash:7.15.2若启动之后出现类似下图的界面就代表成功启动并连接到elasticsearch。
-
配置spring boot项目
pom.xml:
<!-- logstash --> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.2</version> </dependency>logback-spring.xml:
增加下面的配置,这里的日志框架是logback,其余的日志框架另行百度。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- logstash,将日志推送到logstash --> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>localhost:4560</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <!-- 总环境日志配置 --> <root level="DEBUG"> <appender-ref ref="LOGSTASH"/> </root> </configuration>启动spring boot,出现下图界面就代表成功抓取到日志,红框是input到的日志,绿色的是配置文件中的stdout插件的codec配置了rubydebug的原因,这个就和最终推送到elasticsearch之后看到的差不多。
再去kibana中查看,下图中的索引就是上面配置的mylostash.conf配置文件中配置的elasticsearch索引。