# 【ELK】SpringBoot 整合 ELK 实现分布式日志搜索
# 一。环境准备:
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:
# 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 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/> </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 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 中查看创建索引及查看日志:
# 可以看到我们的 elk 已经走通了,后面就可以根据自己的实际业务需求去进行修改配置。
# 总结
本次通过 docker 搭建 elk+springboot 的过程还是花费了不少的时间的,还是有所收获的。碰到问题的话尽量去百度查资料,耐心点基本上都是可以解决的。有感兴趣的小伙伴可以一起交流学习呀。
# 关于我
Brath 是一个热爱技术的 Java 程序猿,公众号「InterviewCoder」定期分享有趣有料的精品原创文章!
非常感谢各位人才能看到这里,原创不易,文章如果有帮助可以关注、点赞、分享或评论,这都是对我的莫大支持!