前提条件:已安装好docker。
1. 创建 Docker 专用网络(容器间通信)
docker network create elk-net # 创建虚拟网络
- 作用:让 ES、Logstash 和 Kibana(可视化工具)在同一个网络内通信,避免跨网络访问问题。
2. 拉取 elk 镜像
docker pull elasticsearch:7.17.5 # 拉取指定版本镜像
docker pull docker.elastic.co/kibana/kibana:7.17.5 #拉取镜像
docker pull docker.elastic.co/logstash/logstash:7.17.5 # 版本需与 Elasticsearch/Kibana 一致
3. 准备本地挂载目录(持久化数据)
此命令非windows创建命令,可以选择手动创建
mkdir -p d:/Docker/es/data # es数据目录
mkdir -p d:/Docker/es/plugins # es插件目录
mkdir -p d:/Docker/es/config # es配置目录
mkdir -p d:/Docker/kibana/config # kibana配置目录
mkdir -p d:/Docker/logstash/{config,pipeline} # logstash的配置目录和管道定义目录
- 作用:将容器内的数据目录(如索引数据)和插件目录映射到本地,防止容器删除后数据丢失。
- -p 参数表示递归创建目录(即使父目录不存在也会自动创建)。
4.下载对应版本的IK分词器(如果只收集日志可忽略此步骤)
elasticsearch-analysis-ik-7.17.5,将下载的文件解压到d:/Docker/es/plugins插件目录下。
5. 启动 Elasticsearch 容器
创建elasticsearch.yml文件
cluster.name: "docker-es"
network.host: 0.0.0.0
http.port: 19200 # 修改 HTTP 端口
transport.port: 19300 # 修改 Transport 端口
# 单节点模式
discovery.type: single-node
# 开启安全认证
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
# 跨域配置(可选)
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: "X-Requested-With,Content-Type,Authorization"
执行启动命令
docker run -d \
--name elasticsearch \
--net elk-net \
-p 19200:19200 \
-p 19300:19300 \
-e "discovery.type=single-node" \ # 单节点模式
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ # 限制内存占用
-v //d/docker/es/data:/usr/share/elasticsearch/data \
-v //d/docker/es/plugins:/usr/share/elasticsearch/plugins \
-v //d/docker/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
elasticsearch:7.17.5
- -p 19200:19200:ES 的 HTTP 访问端口(SpringBoot 、logstash或 Kibana 连接用)。
- -p 19300:19300:ES 集群内部通信端口(单节点模式可不关注)。
- -v:挂载本地目录到容器,实现数据持久化。
验证 ES 是否运行成功
点击访问 es页面,输入下面自动生成的账号密码。
设置ES用户名和密码(交互式密码和自动生成密码,二选一)
- 容器启动成功后,进入容器:
# 进入容器
docker exec -it elasticsearch /bin/bash
- 交互式密码设置:
# 执行交互式密码设置命令
./bin/elasticsearch-setup-passwords interactive
- 自动生成密码设置,此处我选择的是自动生成。
# 进入容器后执行
./bin/elasticsearch-setup-passwords auto
打印的账号密码信息,一定要保存好
# 打印如下信息,输入y
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y
# 打印的账号密码信息,一定要保存好,保存后请使用自己的打印密码
Changed password for user apm_system
PASSWORD apm_system = jhaPY2JZ2dSPr3KjuKLU
Changed password for user kibana_system
PASSWORD kibana_system = gyLcN19pzREnRSRyGkkb
Changed password for user kibana
PASSWORD kibana = gyLcN19pzREnRSRyGkkb
Changed password for user logstash_system
PASSWORD logstash_system = S9Ydb14dy9SIBVDqAODN
Changed password for user beats_system
PASSWORD beats_system = kiaOgYxuaaLEmtINFZN0
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = nk0OG2SMKpqGCtl6Cj0f
Changed password for user elastic
PASSWORD elastic = 3E7WktRCzEgDwC0NKzvk
6.启动 kibana容器
创建kibana配置文件
放到本地D:\Docker\kibana\config目录下,将上面es生成的账号密码填进去。
server.host: "0.0.0.0" # 允许外部访问
server.port: 5601 # 默认端口,按需调整
elasticsearch.hosts: ["http://elasticsearch:19200"] # 关联 Elasticsearch 容器名
elasticsearch.username: elastic # es的账号
elasticsearch.password: 3E7WktRCzEgDwC0NKzvk #es的密码
elasticsearch.requestTimeout: 3000 # 定义与 Elasticsearch 通信的超时时间,默认值:30000(30 秒)
i18n.locale: "zh-CN" # 可选,设置中文界面
执行启动命令
#启动
docker run -d \
--name kibana \
--network elk-net \ # 若未创建网络,可省略此参数
-p 5601:5601 \
-v //d/docker/kibana/config:/usr/share/kibana/config \
kibana:7.17.5
关键参数说明:
- -p 5601:5601:映射容器端口到宿主机。
- -v //d/docker/kibana/config:/usr/share/kibana/config:将本地目录挂载到容器
kibana启动成功:
访问 kibana 控制页面。进入开发工具菜单,验证 ES 连接。
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国"
}
返回如下:
返回成功。
7.启动logstash容器,通过TCP方式直接采集日志。
创建D:\Docker\logstash\config\logstash.yml文件
logstash.yml:定义 Logstash 全局运行参数,如节点名称、数据目录、日志级别等
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:19200"] # 指向 Elasticsearch 服务地址
config.reload.automatic: true # 启用配置热更新
xpack.management.enabled: false # 关闭 X-Pack 管理
queue.type: persisted # 启用持久化队列(默认队列类型为 memory)
path.data: /usr/share/logstash/data # 持久化数据存储根目录(包含队列、插件数据等
path.queue: /usr/share/logstash/data/queue # 持久化队列存储路径(需确保目录可写)
path.logs: /usr/share/logstash/logs # 指定日志存储根路径(支持绝对路径)
queue.max_bytes: 1024mb # 队列最大容量(超出后触发背压机制)
创建D:\Docker\logstash\config\pipelines.yml文件
pipelines.yml:定义多个独立运行的管道(Pipeline),支持多业务场景隔离。支持多线程独立处理不同数据流,避免资源竞争。
- pipeline.id: my_pipeline
path.config: "/usr/share/logstash/pipeline/logstash.conf"
创建D:\Docker\logstash\pipeline\logstash.conf文件,此处采用TCP网络方式收集日志
logstash.conf:每个 *.conf 文件对应一个数据处理流程,包含以下三部分
- input:定义数据来源(如文件、网络、消息队列等)
- output:定义数据存储或转发目标。
- Filter:解析、清洗、增强数据。此处没用到此参数
input {
tcp {
port => 5044 # 接收日志的端口
codec => json # 支持 JSON 格式输入
}
}
output {
#写入elasticsearch
elasticsearch {
hosts => ["http://elasticsearch:19200"]
index => "logs-%{+YYYY.MM.dd}" # 动态索引名,按日期生成索引
user => "elastic" # es账号
password => "3E7WktRCzEgDwC0NKzvk" # es密码
}
}
创建D:\Docker\logstash\config\log4j2.properties文件
log4j2.properties:控制 Logstash 自身日志的输出级别、滚动策略
# /usr/share/logstash/config/log4j2.properties
# 日志输出到控制台和文件
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{yyyy-MM-dd HH:mm:ss}][%-5p][%-25c] %m%n
# 滚动文件输出
appender.rolling.type = RollingFile
appender.rolling.name = file
appender.rolling.fileName = /usr/share/logstash/logs/logstash.log
appender.rolling.filePattern = /usr/share/logstash/logs/logstash-%d{yyyy-MM-dd}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{yyyy-MM-dd HH:mm:ss}][%-5p][%-25c] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
# 按天滚动
appender.rolling.policies.time.interval = 1
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
# 按大小滚动(100MB)
appender.rolling.policies.size.size = 104857600
appender.rolling.strategy.type = DefaultRolloverStrategy
# 每天最多保留10个滚动文件(避免索引冲突)
appender.rolling.strategy.max = 10
# 根日志级别(建议临时启用DEBUG排查问题)
rootLogger.level = debug
rootLogger.appenderRef.console.ref = console
rootLogger.appenderRef.rolling.ref = file
创建D:\Docker\logstash\config\jvm.options文件
jvm.options:调整 Logstash JVM 堆内存、GC 策略等
# /usr/share/logstash/config/jvm.options
# JVM 堆内存设置(根据服务器内存调整)
-Xms2g
-Xmx2g
# GC 配置(推荐 G1 垃圾回收器)
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
# 其他优化参数
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/logstash/heapdump.hprof
执行启动命令
docker run -d \
--name logstash \
--network elk-net \
-p 5044:5044 \
-v //d/docker/logstash/config:/usr/share/logstash/config \
-v //d/docker/logstash/pipeline:/usr/share/logstash/pipeline \
logstash:7.17.5
启动成功
8.整合SpringBoot,输入日志到ELK。
添加logstash依赖:
# logstash依赖
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.2</version>
</dependency>
日志文件输出配置:
<!-- 日志输出到logstash -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5044</destination> <!-- 指向 Logstash 容器名和端口 -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"appname":"hjmt-yc-system"}</customFields> <!-- 应用名标识,在logstash的配置中通过此标识识别 -->
</encoder>
</appender>
<root level="debug">
<appender-ref ref="LOGSTASH" />
</root>
修改logstash的logstash\pipeline\logstash.conf的配置
注:此处也可以通过多管道的方式操作,在 pipelines.yml中定义多个管道,分别处理不同应用的日志,每个管道独立配置输入、过滤和输出,避免条件判断复杂化
input {
tcp {
port => 5044 # 接收日志的端口
codec => json # 支持 JSON 格式输入
}
}
output {
# 多个项目,使用appname对日志进行index的区分。与SpringBoot的日志文件中的appname相匹配。
if [appname] == "hjmt-yc-system" {
elasticsearch {
hosts => ["http://elasticsearch:19200"]
index => "hjmt-yc-system-logs-%{+YYYY.MM.dd}" # 按日期生成索引
user => "elastic"
password => "3E7WktRCzEgDwC0NKzvk"
}
}
else if [appname] == "hjmt-yc-auth" {
elasticsearch {
hosts => ["http://elasticsearch:19200"]
index => "hjmt-yc-auth-logs-%{+YYYY.MM.dd}" # 按日期生成索引
user => "elastic"
password => "3E7WktRCzEgDwC0NKzvk"
}
}
}
删除logstash容器重新运行
运行成功后进入到容器内存检查logstash.conf配置是否成功挂载。
启动SpringBoot项目,去kibana图形化界面添加对应的index
Management:Stack Management —>Kibana:Index Patterns —>Create Index Pattern
至此,SpringBoot和ELK整合成功。
9.在kibana查看SpringBoot日志
10.通过读取日志文件的方式采集日志
修改SpringBoot的logback.xml文件,去掉以下配置
<!-- 日志输出到logstash -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5044</destination> <!-- 指向 Logstash 容器名和端口 -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"appname":"hjmt-yc-auth"}</customFields> <!-- 应用1标识 -->
</encoder>
</appender>
<root level="debug">
<appender-ref ref="LOGSTASH" />
</root>
新增以下配置
<!-- 定义 JSON 日志字段 -->
<springProperty name="appName" scope="context" source="spring.application.name"/>
<springProperty name="ip" scope="context" source="spring.cloud.client.ip-address"/>
<!-- 系统json日志输出 -->
<appender name="json_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.json</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.json.gz</fileNamePattern>
<!-- 日志最大的历史 7天 -->
<maxHistory>7</maxHistory>
</rollingPolicy>
<!-- 使用 LogstashEncoder 生成结构化 JSON -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"appName":"${appName}", "ip":"${ip}"}</customFields>
<includeContext>false</includeContext>
<timeZone>UTC</timeZone>
</encoder>
</appender>
<root level="INFO">
<!-- 将日志输出到日志json文件中 -->
<appender-ref ref="json_info" />
<appender-ref ref="console" />
</root>
修改D:\Docker\logstash\pipeline\logstash.conf文件
sincedb文件所在目录是\logstash\data\plugins\inputs\file\ ,
input {
file{
type => "hjmt-yc-system"
path => "/usr/share/logstash/logs/hjmt-yc-system/info.json" # 监控的日志文件路径
start_position => "beginning" # 首次启动读取全部历史日志,仅在sincedb文件中没有记录的情况下生效
codec => json # 若日志为 JSON 格式,直接解析(需与 LogstashEncoder 配合)
}
}
output {
# stdout {} # 输出到控制台(验证用)
if [type] == "hjmt-yc-system" {
elasticsearch {
hosts => ["http://elasticsearch:19200"]
index => "hjmt-yc-system-logs-%{+YYYY.MM.dd}" # 按日期生成索引
user => "elastic"
password => "3E7WktRCzEgDwC0NKzvk"
}
}
}
修改logstash的启动命令
docker run -d \
--name logstash \
--network elk-net \
-p 5044:5044 \
-v //d/docker/logstash/config:/usr/share/logstash/config \
-v //d/docker/logstash/pipeline:/usr/share/logstash/pipeline \
-v //d/docker/logstash/data:/usr/share/logstash/data # 宿主机数据目录
-v //e/work/workspace/Hjmt-Cloud/logs:/usr/share/logstash/logs # 宿主机日志目录,需挂载至容器供 Logstash 读取
logstash:7.17.5