【ELK】SpringBoot整合ELK实现分布式日志搜索

InterviewCoder

# 【ELK】SpringBoot 整合 ELK 实现分布式日志搜索

# 一。环境准备:

# 安装 ElasticSearch、Kibana、LogStash。

docker 内,下载需要的镜像。然后启动一个镜像。

# 1.Es 创建

创建并运行一个 ElasticSearch 容器:

1
2
#7.6.2 启动需要增加discovery.type=single-node
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e discovery.type=single-node -d -p 9200:9200 -p 9300:9300 --name MyES elasticsearch:7.6.2

浏览器访问测试:http://127.0.0.1:9200,应输出如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name": "WQawbNC",
"cluster_name": "docker-cluster",
"cluster_uuid": "f6QviESlT_e5u3kaZFHoWA",
"version": {
"number": "7.6.2",
"build_flavor": "default",
"build_type": "docker",
"build_hash": "2f4c224",
"build_date": "2020-03-18T23:22:18.622755Z",
"build_snapshot": false,
"lucene_version": "7.7.2",
"minimum_wire_compatibility_version": "5.6.0",
"minimum_index_compatibility_version": "5.0.0"
},
"tagline": "You Know, for Search"
}

# 2.Kibana 创建

创建并运行运行一个 Kibana 容器:
创建之前,先查看 ES 在 docker 中的 ip 地址,因为我们的 kibana 在启动的时候需要连接到 ES。

1
2
3
4
5
6
7
8
9
10
#先使用命令 docker ps 查看ES容器ID
docker ps
#输出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a266d1ff5c1b elasticsearch:7.6.2 "/usr/local/bin/dock…" 19 hours ago Up 18 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp MyES

#通过容器ID,查看容器IP地址。以上的a266d1ff5c1b就是我们ES的容器ID
docker inspect --format '{{ .NetworkSettings.IPAddress }}' a266d1ff5c1b
#输出如下:
172.17.0.3

得到了 ES 容器 IP 地址之后,创建并运行一个 Kibana 容器。

1
2
#注意,此处的ELASTICSEARCH_URL需替换成上面ES容器的IP地址,否则Kibana连接不到ES
docker run -d --name MyKibana -p 5601:5601 -e ELASTICSEARCH_URL=http://172.17.0.3:9200 kibana:7.6.2

浏览器访问测试:http://127.0.0.1:5601

image.png

# 3.LogStash 创建

创建并运行运行一个 LogStash 容器:

1
docker run -d -p 9600:9600 -p 4560:4560 --name MyLogStash logstash:7.6.2

运行后,进入容器内部。修改 logstash.yml 配置文件:

1
docker exec -it 容器ID bash
1
cd config
1
vi logstash.yml
1
2
3
4
5
# 改成如下配置
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://esIP地址:9200" ]
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: your password

修改 pipeline 下的 logstash.conf 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
input {
tcp {
#模式选择为server
mode => "server"
#ip和端口对应docker对外暴露logstash的地址可以使用下面命令查看
#docker inspect logstash | grep IPAddress
host => "172.17.0.3"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
action => "index"
#这里是es的地址,多个es要写成数组的形式
hosts => "http://你的esIP:9200"
user => elastic #如果es配置了账号密码,要配置账号密码
password => password #如果es配置了账号密码,要配置账号密码
manage_template => true
#用于kibana过滤,可以填项目名称 必须必须必须小写。
index => "demologs"
}
}

最后重启我们的 logstash

1
docker restart MyLogStash

# 二、 使 ELK 与 SpringBoot 集成

maven 相关依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.elk</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<ch.qos.logback.version>1.2.3</ch.qos.logback.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${ch.qos.logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${ch.qos.logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${ch.qos.logback.version}</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.1</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

logback 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<include resource="org/springframework/boot/logging/logback/base.xml" />
<contextName>logback</contextName>

<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>你的LogStashIP地址:4560</destination>
<!-- encoder必须配置,有多种可选 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>

<root level="info">
<appender-ref ref="stash" />
</root>
</configuration>

日志记录:

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("/test")
public class ElkController {

private final Logger logger = LoggerFactory.getLogger(getClass());

@RequestMapping("/test")
public String elkAdd(){
logger.info("日志记录"+System.currentTimeMillis());
return "1";
}
}

在 Kibana 中查看创建索引及查看日志:
image.png

image.png

# 可以看到我们的 elk 已经走通了,后面就可以根据自己的实际业务需求去进行修改配置。

# 总结

本次通过 docker 搭建 elk+springboot 的过程还是花费了不少的时间的,还是有所收获的。碰到问题的话尽量去百度查资料,耐心点基本上都是可以解决的。有感兴趣的小伙伴可以一起交流学习呀。

# 关于我

Brath 是一个热爱技术的 Java 程序猿,公众号「InterviewCoder」定期分享有趣有料的精品原创文章!

InterviewCoder

非常感谢各位人才能看到这里,原创不易,文章如果有帮助可以关注、点赞、分享或评论,这都是对我的莫大支持!

评论