搭建Spring Boot + ELK日志平台,实现可视化日志监控

1.原因:

每次用tail -f 在服务器上翻日志太麻烦,线上问题排查时有时找不到日志。本文将带你从零开始,搭建一套企业级的ELK日志平台,让你的日志管理变得简单、高效、可视化。

传统日志管理的痛点

登录服务器

ssh user@prod-server

查看日志

tail -f /var/log/app/app.log

搜索错误

grep "ERROR" /var/log/app/app.log

跨服务器查日志?噩梦开始...

痛点总结

日志分散在多台服务器,排查问题需要来回切换, 搜索能力有限,复杂的查询难以实现,无法可视化分析,只能看原始文本日志,文件轮转后,历史日志难以追溯

2.分析:

功能介绍:

|-------------------|----|--------------------------|
| Elasticsearch | ES | 分布式搜索和分析引擎,负责日志的存储和索引 |
| Logstash | - | 日志采集管道,支持从多种来源采集、过滤、转换数据 |
| Kibana | - | 可视化平台,提供图表、仪表盘、日志浏览界面 |

3.解决:

3.1 版本选择

本文使用 ELK 7.17.15,这是7.x系列的最后一个稳定版本,兼容性好,社区文档丰富。

组件 版本 说明
Elasticsearch 7.17.15 长期支持版本
Kibana 7.17.15 与ES版本保持一致
Logstash 7.17.15 与ES版本保持一致
Spring Boot 3.x 使用logback-logstash-encoder

3.2 macOS 安装(使用二进制包)

安装一般不管win10\mac\linux,都是官网、华为云、阿里云、清华云等镜像搜索下载。

备注:我的是mac安装包,如果不能下载留言,我上传或者发送。

创建安装目录

mkdir -p ~/elk && cd ~/elk

下载 Elasticsearch (Apple Silicon 版本)

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.15-darwin-aarch64.tar.gz

下载 Kibana

curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.17.15-darwin-x86_64.tar.gz

下载 Logstash

curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.17.15-darwin-x86_64.tar.gz

解压

for file in *.tar.gz; do tar -xzf "$file"; done

重命名

mv elasticsearch-7.17.15 elasticsearch

mv kibana-7.17.15-darwin-x86_64 kibana

mv logstash-7.17.15-darwin-x86_64 logstash

3.3 启动

3.3.1 启动ES:

复制代码
# 进入 ES 目录并后台启动
cd ~/elk/elasticsearch
./bin/elasticsearch -d

localhost:9002

3.3.2 启动kibana

cd ~/elk/kibana

nohup ./bin/kibana > ~/elk/logs/kibana.log 2>&1 &

localhost:5601

3.3.3 启动logstash

先建测试包

复制代码
config目录下新建 springboot-logstash.conf
java 复制代码
input {
  file {
    path => "/tmp/spring-logs/*.log"
    codec => json
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "springboot-logs-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}
复制代码
启动命令:
logstash -f /path/to/config.conf

4. springboot 项目关联

4.1 新建项目 elk_dm

pom.xml

java 复制代码
<?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>3.5.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dp.ccrr</groupId>
    <artifactId>elk_dm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>elk_dm</name>
    <description>elk_dm</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</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>
        </dependency>
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>7.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

resource :

logback-spring.xml

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="appName" source="spring.application.name" defaultValue="app"/>

    <!-- JSON 格式输出到文件 -->
    <appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/tmp/spring-logs/${appName}.log</file>
        <!-- 添加滚动策略(同时解决 TriggeringPolicy 警告) -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/tmp/spring-logs/${appName}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"service":"${appName}","environment":"dev"}</customFields>
        </encoder>
    </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>

    <!-- 开发环境:输出到控制台 -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>

    <!-- 生产/测试环境:输出 JSON 到文件 -->
    <springProfile name="prod,test,default">
        <root level="INFO">
            <appender-ref ref="JSON_FILE"/>
        </root>
    </springProfile>
</configuration>
复制代码
ELKController.java
java 复制代码
package com.dp.ccrr.elk_dm.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/elk")
public class ELKController {
    @RequestMapping("/")
    public String index() {
        log.info("------------ELKController.index");
        return "Hello World!";
    }
}
复制代码
TraceIdFilter.java
java 复制代码
package com.dp.ccrr.elk_dm.filter;

import jakarta.servlet.*;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.UUID;

@Component
public class TraceIdFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        MDC.put("traceId", UUID.randomUUID().toString().replace("-", ""));
        chain.doFilter(request, response);
        MDC.clear();
    }
}

启动项目:

http://localhost:8081/elk/

  1. 测试:

http://localhost:9200/test-index/_search?pretty

http://localhost:5601/

新建信息仓库,

输入springboot-logs*

然后在discover查看

搜索条件:

service elk_dm

today

然后就能看到测试数据了。

Done.

相关推荐
Flittly8 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring
Web Security Loop11 小时前
MAC卸载JDK环境
java·macos·jdk
小强库计算机毕业设计14 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
毕设单片机17 小时前
顺顺救助站流浪动物领养系统的设计与实现46649----SpringBoot + Vue.js + MySQL|领养审核、寻宠发布、救助站点与动物论坛协同
java·spring boot·管理系统·流浪动物
云烟成雨TD17 小时前
Micrometer 系列【63】统一观测:基于 Spring Boot 的生产级演示案例 | 基于 OTLP 集成 Prometheus + Jaeger
spring boot·云原生·prometheus
csdn2015_17 小时前
springboot +mybatis 查询myql开启程序级别缓存
spring boot·缓存·mybatis
chuan.bai17 小时前
Java RAG 实战(第 8 篇):Spring Boot RAG 查询 API
java·spring boot·贪心算法
vx-程序开发18 小时前
springboot旅游推介平台---附源码24175
java·spring boot·python·spring cloud·eclipse·django·idea
小蒜学长18 小时前
“喵汪联盟”宠物领养系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·宠物
xbgRS21 小时前
springboot的自动装配
java·spring boot