技术与更多 2020-04-15
“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
SpringBoot可以通过集成logstash-logback-encoder插件收集日志并写入到ELK中。当然如果你使用的是log4j2或其他日志框架,只需要集成对应插件即可。
本文采用docker-compose方式部署ES+Logstash+Kibana
新建项目目录
$ mkdir elk-demo
创建docker-compose文件,内容如下:
version: ‘3.5‘ services: elasticsearch: container_name: elk-es image: elasticsearch:6.5.0 restart: always ports: - 9200:9200 - 9300:9300 environment: - TZ=Asia/Shanghai volumes: - ./es/data:/usr/share/elasticsearch/data - ./es/es-single.yml:/usr/share/elasticsearch/config/elasticsearch.yml kibana: container_name: elk-kibana image: kibana:6.5.0 restart: always ports: - 5601:5601 environment: - elasticsearch.hosts=http://elasticsearch:9200 depends_on: - elasticsearch logstash: container_name: elk-logstash image: logstash:6.5.0 restart: always ports: - 5044:5044 - 9600:9600
新建elasticsearch目录
$ mkdir -p es/data
将elasticsearch配置文件放在es文件夹中,es-single.yml文件内容如下:
cluster.name: elasticsearch-single node.name: es-single-node-1 network.bind_host: 0.0.0.0 http.port: 9200 transport.tcp.port: 9300 http.cors.enabled: true http.cors.allow-origin: "*" node.master: true node.data: true action.auto_create_index: true
完成之后回到项目根目录启动ELK
$ docker-compose up -d
$ docker exec -it elk-es /bin/bash $ cd plugins/ # 根据elasticsearch选择插件版本,当前使用6.5.0版本 $ wget http://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/elasticsearch-analysis-ik-6.5.0.zip
安装过程由于网络原因可能会比较慢或者安装失败,可以参考手动安装文档,采用本地打包安装方式。如果无法正常克隆git仓库的话,可以选择使用码云极速下载
下载完成之后,解压到指定目录
$ mkdir elasticsearch-analysis-ik $ unzip elasticsearch-analysis-ik-6.5.0.zip -d elasticsearch-analysis-ik
其他插件可以根据实际需要安装,然后重启容器,观察是否加载ik分词器
$ docker restart elk-es $ docker logs elk-es | grep ik
$ docker exec -it elk-logstash /bin/bash $ cd /usr/share/logstash/config/ # 修改xpack.monitoring.elasticsearch.url值为http://elasticsearch:9200 $ vi logstash.yml # 修改logstash.conf $ cd /usr/share/logstash/pipeline/ $ vi logstash.conf
logstash.conf
input { tcp { port => 5044 codec => json_lines } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] index => "log-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } }
重启logstash
$ docker restart elk-logstash # 观察日志是否连接es正常 $ docker logs -f elk-logstash
elasticsearch启动可能较慢,kibana刚启动的时候连接不上,只需要等待几分钟,等elasticsearch完全启动之后即可。
在pom文件中引入logstash-logback-encoder
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>6.3</version> </dependency>
添加日志配置文件logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>localhost:5044</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> <root level="INFO"> <appender-ref ref="LOGSTASH" /> <appender-ref ref="CONSOLE" /> </root> </configuration>
配置文件中的destination值根据实际环境修改,然后启动SpringBoot项目,通过kibana查看日志。
首先通过Management创建index pattern,通过logstash.conf文件知道,日志收集格式是log-%{+YYYY.MM.dd},index patter即为log-*,创建好之后通过Discover菜单查看日志。
至此SpringBoot+ELK环境搭建完成。
另外一部分,则需要先做聚类、分类处理,将聚合出的分类结果存入ES集群的聚类索引中。数据处理层的聚合结果存入ES中的指定索引,同时将每个聚合主题相关的数据存入每个document下面的某个field下。