文章目录
Springboot 整合ELK日志架构
前言
介绍
ELK是Elasticsearch、Logstash、Kibana三个开源软件的组合,相信很多同学使用ELK有去做过分布式日志收集。流程概括为:微服务应用把Logback输出的日志通过HTTP传输至LogStash,然后经过分析过滤,转发至ES,再由Kibana提供检索和统计可视化界面。
先看效果
安装ELK(docker)
ELK版本 7.10.1
- elasticsearch 7.10.1
- logstash 7.10.1
- kibana 7.10.1
安装elasticsearch
1. 拉取镜像并创建对应目录
#1.拉取镜像
docker pull elasticsearch:7.10.1
#2.创建对应目录,按需创建
mkdir -p /home/docker-config/es7/config
mkdir -p /home/docker-config/es7/data
mkdir -p /home/docker-config/es7/plugins
#3.授予data 777权限 否则运行容器会报异常
#("Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes")
cd /home/docker-config/es7
chmod 777 data/
2. 创建elasticsearch.yml
创建elasticsearch.yml文件
vim /home/docker-config/es7/config/elasticsearch.yml
配置如下:
# ======================== Elasticsearch Configuration =========================
# ---------------------------------- Cluster -----------------------------------
# 集群名称,同一集群中节点必须使用相同的名称
cluster.name: my-cluster
# ------------------------------------ Node ------------------------------------
# 节点名称,用于在集群中标识节点
node.name: node-1
# ----------------------------------- Paths ------------------------------------
# 数据存储路径
path.data: /path/to/data
# 日志文件路径
path.logs: /path/to/logs
# ---------------------------------- Network -----------------------------------
# 绑定的主机地址,设置为 0.0.0.0 表示监听所有网络接口的请求
network.host: 0.0.0.0
# --------------------------------- Discovery ----------------------------------
# 初始主机列表,用于集群发现,可以包含多个主机
discovery.seed_hosts: ["host1", "host2", "host3"]
# --------------------------------- Gateway ------------------------------------
# 索引和集群元数据的持久化存储路径
path.repo: /path/to/repo
# --------------------------------- Cluster ------------------------------------
# 初始主节点列表,用于选举集群的初始主节点
cluster.initial_master_nodes: ["node-1"]
# ---------------------------------- Memory ------------------------------------
# JVM 堆内存的最小值和最大值
# 这里设置为相同的值,表示固定大小的堆内存
# 可以根据实际情况进行调整,比如 2g、4g 等
# 注意:最大堆内存不应超过机器的物理内存限制
# -Xms 表示 JVM 堆的初始大小,-Xmx 表示 JVM 堆的最大大小
# 默认情况下,Elasticsearch 会根据可用的内存自动分配堆大小
# 如果你的集群很小,可以将两个值设置为相同的较小值
# 如果你的集群很大,可以增加堆内存以提高性能
# -XX:-UseConcMarkSweepGC
# -XX:CMSInitiatingOccupancyFraction=75
# -XX:+UseCMSInitiatingOccupancyOnly
# set ES_HEAP_SIZE=1g
# ---------------------------------- Security ----------------------------------
# 安全相关的配置,如启用或禁用 X-Pack 安全特性、SSL/TLS 相关配置等
# 这里省略了具体的安全配置,请根据实际需求进行设置
# --------------------------------- Various ------------------------------------
# 其他各种可选配置项,可以按需进行设置
这里没有开启es认证
3. 创建容器
#创建容器
[root@localhost es7]# docker run -d --name=es7 -p 9200:9200 -p 9300:9300 -v/home/docker-config/es7/config:/usr/share/elaticsearch/config -v /home/docker-config/es7/data:/usr/share/elasticsearch/data -v /home/docker-config/es7/plugins:/usr/share/elasticsearch/plugins -e discovery.type=single-node elasticsearch:7.10.1
#curl测试运行是否正常
[root@localhost es7]# curl 127.0.0.1:9200
{
"name" : "fe6589e61d9d",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "mo8_wdYNRLKGRWlFSh_4Gw",
"version" : {
"number" : "7.10.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
"build_date" : "2020-12-05T01:00:33.671820Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
遇到问题
ERROR: [2] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/docker-cluster.log
#解决
#查看当前 vm.max_map_count值
[root@localhost conf]# sysctl vm.max_map_count
vm.max_map_count = 65530
#修改vm.max_map_count值满足Elasticsearch、Kibana的内存映射需求
[root@localhost conf]# sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
安装kibana
1. 拉取镜像并创建对应目录
#1.拉取镜像
docker pull kibana:7.10.1
#创建所需目录
mkdir -p /home/docker-config/kibana7/config
2. 创建kibana.yml
vim /home/docker-config/kibana7/config/kibana.yml
配置如下:
server.port: 5601
server.host: "0"
elasticsearch.hosts: ["http://你的ip:9200"]
# elasticsearch.username: "kibana_system"
# elasticsearch.password: "elastic"
3. 创建容器
#创建容器
[root@localhost kibana7]# docker run -d --name kibana7 -p 5601:5601 -v /home/docker-config/kibana7/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.10.1
4. 访问kibana
ip
换成你宿主机的ip: http://ip:5601/app/home#/
安装Logstash
1. 拉取镜像并创建对应目录
#1.拉取镜像
docker pull logstash:7.10.1
#创建所需目录
mkdir -p /home/docker-config/logstash7/config
mkdir -p /home/docker-config/logstash7/pipeline
2. 创建kibana.yml
vim /home/docker-config/logstash/config/logstash.yml
配置如下:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.32.129:9200" ]
xpack.management.pipeline.id: ["main"]
2. 创建配置文件
config/logstash.yml
vim /home/docker-config/logstash/config/logstash.yml
配置如下:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://你的ip:9200" ]
xpack.management.pipeline.id: ["main"]
config/pipeline.yml
vim /home/docker-config/logstash/config/pipeline.yml
配置如下:
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline/logstash.config"
pipeline/logstash.conf
vim /home/docker-config/logstash/config/pipeline.yml
配置如下:
input {
tcp {
port => 5044
mode => "server"
host => "0.0.0.0"
codec => json_lines
}
}
filter{
}
output {
elasticsearch {
hosts => ["你的ip:9200"]
# 索引名称,没有会自动创建
# index => "app-elk-demo-%{+YYYY-MM-dd}"
index => "app-%{[appname]}-%{+YYYY-MM-dd}"
}
}
3. 创建容器
#创建容器
[root@localhost kibana7]# docker run -d --name logstash7 -p 5044:5044 -p 9600:9600 -v /home/docker-config/logstash7/config/logstash.yml:/usr/share/logstash/config/logstash.yml -v /home/docker-config/logstash7/config/pipeline.yml:/usr/share/logstash/config/pipeline.yml -v /home/docker-config/logstash7/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf logstash:7.10.1
SpringBoot对接ELK
使用Logback将日志发送至LOGSTASH服务上
依赖pom.xml
引入logstash-logback-encoder即可启用LogstashTcpSocketAppender
<?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.7.14</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sam</groupId>
<artifactId>elk-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>elk-demo</name>
<description>elk-demo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
logback.xml
- destination:连接的logstash的input的ip及端口号,不用加http
- customFields:自定义的字段索引,logstash也可以动态取到
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="./logs"/>
<!-- Console Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- File Appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Logstash Appender -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>你的ip:5044</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"host":"${HOSTNAME}","appname":"elk-demo"}</customFields>
</encoder>
</appender>
<!-- Spring Boot Logger -->
<logger name="com.sam" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="LOGSTASH"/>
</logger>
<!-- Root Logger -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
Kibana面板使用
进入首页:http://ip:5601/app/home#/
进入管理spaces页面
创建Index patterns
输入原先logstash设定好的pattern app-elk-demo*
配置
就可以看到自己创建的索引模板了
查询面板
进入Discover面板
查看索引模板
找到自己的app-elk-demo*索引
总结
本文仅仅简单介绍了SpringBoot对接ELK的使用,喜欢就点个Star吧!
项目demo:https://gitee.com/Sam997/elk-demo