一、ELK是什么
“ELK”是三個開源項目的首字母縮寫,這三個項目分別是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一個搜索和分析引擎。Logstash 是服務器端數據處理管道,能夠同時從多個來源采集數據,轉換數據,然后將數據發送到諸如 Elasticsearch 等“存儲庫”中。Kibana 則可以讓用戶在 Elasticsearch 中使用圖形和圖表對數據進行可視化。
SpringBoot可以通過集成logstash-logback-encoder插件收集日志並寫入到ELK中。當然如果你使用的是log4j2或其他日志框架,只需要集成對應插件即可。
二、ELK搭建
本文采用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
安裝ik分詞器
$ 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.0/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
配置logstash
$ 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完全啟動之后即可。
三、SpringBoot接入
在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環境搭建完成。