springboot整合ELK日志架构

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值