首先服務器上需要安裝docker已經docker-compose,如果沒有,可以參考我之前寫的文章進行安裝。
https://blog.csdn.net/a_lllk/article/details/143382884?spm=1001.2014.3001.5502
1.下載并啟動elk容器
先創建一個網關,讓所有的容器共用此網關,方便容器之間互相通信。
docker network create elk-net
編寫docker-compose.yml,我這里的docker-compose版本是2.8.0,可以根據自己安裝的docker-compose去調整version。ELK的版本都使用的事8.6.2。
version: '2.8'
services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:8.6.2restart: alwayscontainer_name: esenvironment:- "ES_JAVA_OPTS=-Xms256m -Xmx512m"- "discovery.type=single-node"- "ELASTIC_USERNAME=elastic"- "ELASTIC_PASSWORD=elastic"- "ingest.geoip.downloader.enabled=false"- "xpack.security.transport.ssl.enabled=false"- "xpack.security.http.ssl.enabled=false"- "xpack.security.enabled=true"- "bootstrap.memory_lock=true"- "cluster.name=es-cluster"ports:- "9200:9200"- "9300:9300"privileged: truenetworks:- elk-netlogstash:image: docker.io/logstash:8.6.2container_name: logstashenvironment:- "LS_JAVA_OPTS=-Xmx256m -Xms256m"ports:- "5044:5044" # Beats通信- "9600:9600" # API通信networks:- elk-netrestart: alwaysprivileged: truekibana:image: docker.elastic.co/kibana/kibana:8.6.2container_name: kibanaenvironment:- "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"- "SERVER_NAME=kibana"- "XPACK_SECURITY_ENABLED=true"ports:- "5601:5601"networks:- elk-netrestart: alwaysprivileged: truenetworks:elk-net:driver: bridge
將文件放入服務器的任意目錄,然后輸入以下命令運行。
docker-compose up -d
稍等一會,等鏡像下載并創建容器,我這里因為早就下載好了鏡像,所以就直接創建了容器。
可以使用docker ps -a查看容器的創建情況,我的容器創建如下圖
可以使用ip+端口的形式去查看運行容器的情況,這里注意如果是服務器的話記得打開對于端口。
elasticsearch使用ip+:9200端口去訪問
kibana使用ip+:5601去訪問。這里注意,如果頁面顯示"Kibana server is not ready yet."是正常情況,因為目前并沒有對elasticsearch做任何配置,kibana是沒有檢測到es的存在。
logstash暫時沒有驗證的方式,只要看容器的啟動狀態是up就行了。
2.配置ELK
2.1.配置elasticsearch
首先在服務器目錄創建一個文件夾,來存放容器中的數據。
mkdir -p /usr/local/docker/elasticsearch
然后將容器中的配置文件及data,logs目錄復制到當前宿主機指定目錄下。
docker cp es:/usr/share/elasticsearch/config /usr/local/docker/elasticsearch/config
docker cp es:/usr/share/elasticsearch/data /usr/local/docker/elasticsearch/data
docker cp es:/usr/share/elasticsearch/logs /usr/local/docker/elasticsearch/logs
進入config目錄,有一個elasticsearch.yml文件,這個就是容器的配置文件。
我一般為了保險起見,都會先復制一個沒有修改過的配置文件,避免修改配置文件出錯時,容器啟動報錯。
cp elasticsearch.yml elasticsearch-backup.yml
然后修改配置文件,內容如下:
vim elasticsearch.yml
cluster.name: "es-cluster"
network.host: 0.0.0.0node.name: node-01
path.data: /usr/share/elasticsearch/data
path.logs: /usr/share/elasticsearch/logs
http.port: 9200
discovery.type: single-node
xpack.security.enabled: true
bootstrap.memory_lock: true
保存并退出,es的配置文件就編輯好了。
2.配置kibana
同樣創建一個文件夾,來存放容器中的數據。
mkdir -p /usr/local/docker/kibana
將需要的文件復制到宿主機中。
docker cp kibana:/usr/share/kibana/config /usr/local/docker/kibana/docker cp kibana:/usr/share/kibana/data /usr/local/docker/kibana/docker cp kibana:/usr/share/kibana/logs /usr/local/docker/kibana/
進入config目錄,編輯名為kibana.yml的配置文件。
vim kibana.yml
配置文件內容如下
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.username: "elastic"
elasticsearch.password: "elastic"
monitoring.ui.container.elasticsearch.enabled: true
#界面漢化
i18n.locale: "zh-CN"
##啟用或禁用 Kibana 報告功能的角色管理
xpack.reporting.roles.enabled: false
保存并退出,kibana配置文件就算改好了。
3.配置logstash
創建文件夾
mkdir -p /usr/local/docker/kibana
從容器中復制文件夾
docker cp logstash:/usr/share/logstash/pipeline/ /usr/local/docker/logstash/
進入/logstash/pipeline,編輯logstash.conf
input {beats {port => 5044}
}output {elasticsearch {hosts => ["http://elasticsearch:9200"]user => "elastic"password => "elastic"index => "logs-%{+YYYY.MM.dd}"}
}
3.重新創建容器
上面就對所有容器的配置文件做了處理,然后因為第一次啟動的時候沒有掛載目錄,所以更改的配置配置文件也不會生效,所以我們就需要重新創建一下容器,并將所有編輯的配置文件掛載到容器中去
首先對所有容器進行移除
docker stop es logstash kibana
docker rm es logstash kibana
然后重新編輯上面的docker-compose.yml,將宿主機中的目錄掛載到容器中。
version: '2.8'
services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:8.6.2restart: alwayscontainer_name: esvolumes:- /usr/local/docker/elasticsearch/data:/usr/share/elasticsearch/data - /usr/local/docker/elasticsearch/logs:/usr/share/elasticsearch/logs - /usr/local/docker/elasticsearch/config:/usr/share/elasticsearch/config environment:- "ES_JAVA_OPTS=-Xms256m -Xmx512m"- "discovery.type=single-node"- "ELASTIC_USERNAME=elastic"- "ELASTIC_PASSWORD=elastic"- "ingest.geoip.downloader.enabled=false"- "xpack.security.transport.ssl.enabled=false"- "xpack.security.http.ssl.enabled=false"- "xpack.security.enabled=true"- "bootstrap.memory_lock=true"- "cluster.name=es-cluster"ports:- "9200:9200"- "9300:9300"privileged: truenetworks:- elk-netlogstash:image: docker.io/logstash:8.6.2container_name: logstashenvironment:- "LS_JAVA_OPTS=-Xmx256m -Xms256m"volumes:- /usr/local/docker/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:rw # Logstash配置ports:- "5044:5044" # Beats通信- "9600:9600" # API通信networks:- elk-netrestart: alwaysprivileged: truekibana:image: docker.elastic.co/kibana/kibana:8.6.2container_name: kibanaenvironment:- "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"- "SERVER_NAME=kibana"- "XPACK_SECURITY_ENABLED=true"volumes:- /usr/local/docker/kibana/logs:/usr/share/kibana/logs - /usr/local/docker/kibana/data:/usr/share/kibana/data- /usr/local/docker/kibana/config:/usr/share/kibana/config ports:- "5601:5601"networks:- elk-netrestart: alwaysprivileged: truenetworks:elk-net:driver: bridge
運行命令,還是生成了三個容器。使用上面的ip+端口的方式去驗證,發現es可以訪問,但是kibana一直在嘗試重啟,說明配置文件存在問題。
使用log命令查看kibana的啟動日志,
docker logs -f kibana
發現es報錯了,報錯信息如下
"Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html"
這里大概意思就是elastic作為超級賬號,是不能在kibana中直接使用,這里推薦使用賬戶token的方式去連接es。所以這里需要使用token的方式去連接es。
先進入到es的容器之中,然后運行一下命令,生成對應的token令牌。
進入容器:
docker exec -it es /bin/bash
運行生成令牌命令:
bin/elasticsearch-service-tokens create elastic/kibana default
復制等號后面的token信息
exit;退出容器,然后進入kibana的配置文件存放位置
cd usr/local/docker/kibana/config/
編輯kibana.yml,內容如下:
將之前配置的用戶名和密碼注釋或刪除,然后新增elasticsearch.serviceAccountToken,內容為剛才容器中返回的token信息。
然后wq!保存,重啟kibana
docker restart kibana
然后使用ip+:5601的方式訪問kibana,發現已經可以正常登錄使用了,也就是kibana已經成功連接了es。
4.在SpringBoot項目中簡單使用
elk的使用方式有很多種,這里簡單演示一下整合springBoot。
先創建一個springBoot項目,并導入以下jar包
<!-- Logback Classic --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency><!-- Logstash Logback Encoder --><dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>6.3</version></dependency>
然后在application.properties同級目錄,新建一個文件,文件名就是"logback-spring.xml"
然后xml內容如下。
<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern></encoder></appender><!-- 控制臺輸出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><layout class="ch.qos.logback.classic.PatternLayout"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg)%n</pattern></layout></appender><!-- logback 輸出 --><appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>60.204.148.130:5044</destination><encoder class="net.logstash.logback.encoder.LogstashEncoder"><includeCallerData>true</includeCallerData><timeZone>UTC</timeZone><customFields>{"server_name":"demo-server"}</customFields></encoder></appender><root level="DEBUG"><!-- 將日志發送到Logstash --><appender-ref ref="STDOUT"/><appender-ref ref="STASH"/></root>
</configuration>
然后直接啟動springBoot項目,我這邊為了演示,level使用的是debug模式,如果覺得debug模式記錄太多的話,可以將xml最下面的root level值改為info.
然后訪問kibana主頁,點擊右側management下面的Stack Management。
進入Stack Management后,選擇右邊的索引管理。
這里已經成功根據配置文件,新建了一個記錄springBoot項目運行日志的索引。
然后可以點擊右側Management下的開發工具。
在左邊控制臺中輸入下面命令,去查看日志的記錄清空。
GET /logs-2025.01.16/_search // _search
{"sort": [{"@timestamp": {"order": "desc"}}], "query": {"match_all": {}}
}