使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用
首先服务器上需要安装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.2
restart: always
container_name: es
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: true
networks:
- elk-net
logstash:
image: docker.io/logstash:8.6.2
container_name: logstash
environment:
- "LS_JAVA_OPTS=-Xmx256m -Xms256m"
ports:
- "5044:5044" # Beats通信
- "9600:9600" # API通信
networks:
- elk-net
restart: always
privileged: true
kibana:
image: docker.elastic.co/kibana/kibana:8.6.2
container_name: kibana
environment:
- "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
- "SERVER_NAME=kibana"
- "XPACK_SECURITY_ENABLED=true"
ports:
- "5601:5601"
networks:
- elk-net
restart: always
privileged: true
networks:
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.0
node.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.2
restart: always
container_name: es
volumes:
- /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: true
networks:
- elk-net
logstash:
image: docker.io/logstash:8.6.2
container_name: logstash
environment:
- "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-net
restart: always
privileged: true
kibana:
image: docker.elastic.co/kibana/kibana:8.6.2
container_name: kibana
environment:
- "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-net
restart: always
privileged: true
networks:
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": {}
}
}