docker desktop安装ELK,整合springboot收集日志

前提条件:已安装好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  

至此,在docker desktop安装ES,logstash,kibana,并整合SpringBoot,到查看日志的全部流程大体已完成。对于docker和ELK三大件还有更多细节的东西需要学习,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值