DukeDuke
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
  • 技术文档

    • 网络原理

      • 交换机
      • 路由器
      • TCP/IP协议
      • HTTP 与 HTTPS
    • 软件架构

      • 什么是软件架构
      • 分层架构
      • 微服务架构
      • 事件驱动架构
      • 领域驱动设计(DDD)
      • 架构图
      • 高并发系统
    • Vue3

      • Vue3简介
      • Vue3响应式系统
      • Vue3组合式API
      • Vue3生命周期
      • Vue3模板语法
      • Vue3组件系统
      • Vue3 路由系统
      • Vue3 状态管理
      • Vue3 性能优化
      • Vue3 TypeScript 支持
      • Vue3 项目实战
      • VUE 面试题大全
      • Node.js 安装
    • JAVA

      • JVM

        • 认识JVM
        • JVM类加载器
        • 运行时数据区
        • 执行引擎
        • 本地方法接口
        • 本地方法库
        • JVM垃圾回收
        • JVM性能监控
        • JVM调优
      • 设计模式
        • 单例模式
        • 工厂模式
        • 策略模式
        • 适配器模式
        • 建造者模式
        • 原型模式
        • 装饰器模式
        • 代理模式
        • 外观模式
        • 享元模式
        • 组合模式
        • 桥接模式
      • Java多线程

        • Java 线程基础详解
        • Java 线程池详解
        • Java ThreadLocal 详解
        • Java volatile 详解
        • Java 线程间通信详解
        • Java 线程安全详解
        • Java 线程调度详解
        • Java 线程优先级详解

        • Java 线程中断详解
        • Java 线程死锁详解
      • Java反射
      • Java 面试题

        • Java 基础概念面试题
        • Java 面向对象编程面试题
        • Java 集合框架面试题
        • Java 多线程与并发面试题
        • JVM 与内存管理面试题
        • Java I/O 与 NIO 面试题
        • Java 异常处理面试题
        • Java 反射与注解面试题
        • Java Spring 框架面试题
        • Java 数据库与 JDBC 面试题
        • Java 性能优化面试题
        • Java 实际项目经验面试题
        • Java 高级特性面试题
        • Java 面试准备建议
    • Python

      • Python简介
      • Python安装
      • Python hello world
      • Python基础语法
      • Python数据类型
      • Python数字
      • Python字符串
      • Python列表
      • Python元组
      • Python字典
      • Python日期时间
      • Python文件操作
      • Python异常处理
      • Python函数
      • Python类
      • Python模块
      • Python包
      • Python多线程
      • Python面向对象
      • Python爬虫
      • Django web框架
      • Python 面试题

        • Python 面试题导航
        • Python 基础概念
        • Python 面向对象编程
        • Python 数据结构
        • Python 高级特性
        • Python 框架
        • Python 性能优化
        • Python 项目经验
    • Spring

      • Spring
      • Springboot
      • Spring Security 安全框架
      • SpringBoot 中的事件详解
      • SpringBoot 中的定时任务详解
      • SpringBoot 自动装配原理与源码解释
    • Mybatis

      • Mybatis
      • Mybatis-Plus
    • 数据库

      • Redis

        • Redis简介
        • Redis(单机)安装
        • Redis配置
        • Redis数据结构
        • RDB、AOF 和混合持久化机制
        • Redis内存管理
        • Redis缓存一致性
        • Redis缓存穿透
        • Redis缓存击穿
        • Redis缓存雪崩
        • Redis Lua脚本
        • Redis主从复制
        • Redis哨兵模式
        • Redis集群
        • Redis数据分片
        • Redis CPU使用率过高
        • Redis面试题
      • MySQL

        • MySQL简介
        • MySQL安装
        • MySQL配置
        • MYSQL日常维护
        • MYSQL优化-慢查询
        • MYSQL优化-索引
        • MYSQL数据库设计规范
    • 消息队列

      • RocketMQ
      • Kafka
      • RabbitMQ
      • 消息队列面试题
    • 微服务

      • SpringCloud 微服务
      • Eureka 注册中心
      • Nacos 注册中心
      • Gateway 网关
      • Feign 服务调用
      • Sentinel 限流 与 熔断
      • Seata 分布式事务
      • CAP 理论
      • Redis 分布式锁
      • 高并发系统设计
    • ELK日志分析系统

      • Elasticsearch 搜索引擎
      • Logstash 数据处理
      • Kibana 可视化
      • ELK 实战
    • 开放API

      • 开放API设计
      • 开放API示例项目
    • 人工智能

      • 人工智能简介
      • 机器学习

      • 深度学习

      • 自然语言处理

      • 计算机视觉

        • CUDA与cuDNN详细安装
        • Conda 安装
        • Pytorch 深度学习框架
        • yolo 目标检测
        • TensorRT 深度学习推理优化引擎
        • TensorFlow 机器学习
        • CVAT 图像标注
        • Windows 下安装 CUDA、cuDNN、TensorRT、TensorRT-YOLO 环境
        • Windows10+CUDA+cuDNN+TensorRT+TensorRT-YOLO 部署高性能YOLO11推理
    • 大数据

      • 大数据简介
      • Hadoop 数据存储
      • Flume 数据采集
      • Sqoop 数据导入导出
      • Hive 数据仓库
      • Spark 数据处理
      • Flink 数据处理
      • Kafka 数据采集
      • HBase 数据存储
      • Elasticsearch 搜索引擎
    • 图像处理

      • 图像处理简介
      • 医学图像web呈现
      • 医学图像处理
      • 切片细胞分离问题
    • 服务器&运维

      • Linux 系统

        • Linux 系统管理
        • Linux 网络管理
        • Linux 文件管理
        • Linux 命令大全
      • Nginx Web 服务器

        • Nginx 安装 与 配置
        • Nginx 负载均衡
        • Nginx SSL证书配置
        • Nginx Keepalived 高可用
      • Docker 容器

        • Docker 简介
        • Docker 安装与配置
        • Docker 命令
        • Docker 部署 Nginx
        • Docker 部署 MySQL
        • Docker 部署 Redis
      • 服务器

        • 塔式服务器
        • 机架式服务器
        • 刀片服务器
      • Git 版本控制
      • Jenkins 持续集成
      • Jmeter 性能测试
      • Let's Encrypt 免费SSL证书
    • 简历

      • 项目经理简历
      • 开发工程师简历

ELK 日志分析系统

概述

ELK Stack 是一个开源的日志分析平台,由三个主要组件组成:

  • Elasticsearch: 分布式搜索引擎,用于存储和检索日志数据
  • Logstash: 日志收集和处理工具
  • Kibana: 数据可视化和分析界面

系统架构

┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  Spring    │    │  Logstash   │    │ Elasticsearch│    │   Kibana    │
│   Boot     │───▶│  (收集处理)  │───▶│  (存储索引)  │◀───│  (可视化)   │
│ 应用日志    │    │             │    │             │    │             │
└─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘

安装指南

1. 环境要求

  • Java 8 或更高版本
  • 至少 4GB 内存
  • 磁盘空间:建议 50GB 以上

2. 下载安装

Elasticsearch

# 下载 Elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.0-linux-x86_64.tar.gz

# 解压
tar -xzf elasticsearch-8.11.0-linux-x86_64.tar.gz
cd elasticsearch-8.11.0

# 启动 Elasticsearch
./bin/elasticsearch

Logstash

# 下载 Logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.11.0-linux-x86_64.tar.gz

# 解压
tar -xzf logstash-8.11.0-linux-x86_64.tar.gz
cd logstash-8.11.0

Kibana

# 下载 Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.11.0-linux-x86_64.tar.gz

# 解压
tar -xzf kibana-8.11.0-linux-x86_64.tar.gz
cd kibana-8.11.0

# 启动 Kibana
./bin/kibana

3. Docker 快速安装

# docker-compose.yml
version: "3.8"
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ports:
      - "9200:9200"
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data

  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.0
    container_name: logstash
    ports:
      - "5044:5044"
    volumes:
      - ./logstash/config:/usr/share/logstash/config
      - ./logstash/pipeline:/usr/share/logstash/pipeline

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200

volumes:
  elasticsearch-data:

配置说明

Elasticsearch 配置

# config/elasticsearch.yml
cluster.name: elk-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
xpack.security.enabled: false

Logstash 配置

# config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
# pipeline/logstash.conf
input {
  beats {
    port => 5044
  }
}

filter {
  if [fields][service] == "spring-boot" {
    grok {
      match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" }
    }
    date {
      match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
    }
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "spring-boot-logs-%{+YYYY.MM.dd}"
  }
}

Kibana 配置

# config/kibana.yml
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"]

Spring Boot 集成

1. Maven 依赖

<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Logback 配置 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>

    <!-- Logstash Logback Encoder -->
    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>7.4</version>
    </dependency>
</dependencies>

2. Logback 配置

<!-- src/main/resources/logback-spring.xml -->
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <includeMdc>true</includeMdc>
            <includeContext>false</includeContext>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/application.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <includeMdc>true</includeMdc>
            <includeContext>false</includeContext>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

3. 应用配置

# src/main/resources/application.yml
spring:
  application:
    name: elk-demo

logging:
  level:
    root: INFO
    com.example: DEBUG
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"

4. 示例控制器

// src/main/java/com/example/elk/controller/LogController.java
package com.example.elk.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/logs")
public class LogController {

    private static final Logger logger = LoggerFactory.getLogger(LogController.class);

    @GetMapping("/test")
    public Map<String, Object> testLog() {
        logger.info("收到测试日志请求");
        logger.debug("调试信息:用户访问了测试接口");
        logger.warn("警告:这是一个测试警告");
        logger.error("错误:这是一个测试错误");

        Map<String, Object> result = new HashMap<>();
        result.put("message", "日志测试成功");
        result.put("timestamp", System.currentTimeMillis());

        return result;
    }

    @PostMapping("/custom")
    public Map<String, Object> customLog(@RequestBody Map<String, String> request) {
        String message = request.get("message");
        String level = request.get("level");

        switch (level.toLowerCase()) {
            case "debug":
                logger.debug("自定义调试日志: {}", message);
                break;
            case "warn":
                logger.warn("自定义警告日志: {}", message);
                break;
            case "error":
                logger.error("自定义错误日志: {}", message);
                break;
            default:
                logger.info("自定义信息日志: {}", message);
        }

        Map<String, Object> result = new HashMap<>();
        result.put("status", "success");
        result.put("logged_message", message);
        result.put("level", level);

        return result;
    }
}

5. 主应用类

// src/main/java/com/example/elk/ElkDemoApplication.java
package com.example.elk;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ElkDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ElkDemoApplication.class, args);
    }
}

使用 Filebeat 收集日志

1. 安装 Filebeat

# 下载 Filebeat
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.11.0-linux-x86_64.tar.gz

# 解压
tar -xzf filebeat-8.11.0-linux-x86_64.tar.gz
cd filebeat-8.11.0

2. Filebeat 配置

# filebeat.yml
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /path/to/spring-boot/logs/*.log
    fields:
      service: spring-boot
    fields_under_root: true

output.logstash:
  hosts: ["localhost:5044"]

logging.level: info

3. 启动 Filebeat

./filebeat -e -c filebeat.yml

Kibana 可视化配置

1. 创建索引模式

  1. 打开 Kibana (http://localhost:5601)
  2. 进入 Stack Management > Index Patterns
  3. 创建索引模式:spring-boot-logs-*
  4. 设置时间字段:@timestamp

2. 创建仪表板

日志级别统计

{
  "aggs": [
    {
      "id": "1",
      "enabled": true,
      "type": "count",
      "schema": "metric",
      "params": {}
    },
    {
      "id": "2",
      "enabled": true,
      "type": "terms",
      "schema": "segment",
      "params": {
        "field": "level.keyword",
        "size": 5,
        "order": "desc",
        "orderBy": "1"
      }
    }
  ],
  "type": "pie"
}

时间序列图

{
  "aggs": [
    {
      "id": "1",
      "enabled": true,
      "type": "count",
      "schema": "metric",
      "params": {}
    },
    {
      "id": "2",
      "enabled": true,
      "type": "date_histogram",
      "schema": "segment",
      "params": {
        "field": "@timestamp",
        "timeRange": {
          "from": "now-1h",
          "to": "now"
        },
        "useNormalizedEsInterval": true,
        "scaleMetricValues": false,
        "interval": "auto",
        "drop_partials": false,
        "min_doc_count": 1,
        "extended_bounds": {}
      }
    }
  ],
  "type": "line"
}

监控和告警

1. 创建告警规则

{
  "name": "Error Log Alert",
  "type": "threshold",
  "query": {
    "language": "kuery",
    "query": "level: ERROR"
  },
  "threshold": {
    "field": "count",
    "value": 10,
    "comparator": ">"
  },
  "actions": [
    {
      "type": "email",
      "params": {
        "to": ["admin@example.com"],
        "subject": "错误日志告警",
        "body": "检测到大量错误日志,请及时处理"
      }
    }
  ]
}

2. 性能监控

{
  "name": "Response Time Alert",
  "type": "threshold",
  "query": {
    "language": "kuery",
    "query": "message: \"响应时间\" AND response_time > 1000"
  },
  "threshold": {
    "field": "count",
    "value": 5,
    "comparator": ">"
  }
}

最佳实践

1. 日志格式规范

  • 使用结构化日志格式
  • 包含必要的上下文信息
  • 避免记录敏感信息
  • 设置合适的日志级别

2. 性能优化

  • 合理设置索引分片数
  • 定期清理旧日志
  • 使用索引生命周期管理
  • 监控集群资源使用

3. 安全配置

  • 启用 Elasticsearch 安全功能
  • 配置用户认证和授权
  • 使用 HTTPS 传输
  • 定期更新组件版本

故障排除

常见问题

  1. Elasticsearch 启动失败

    • 检查内存配置
    • 验证端口占用
    • 查看错误日志
  2. Logstash 连接失败

    • 检查网络连通性
    • 验证配置文件语法
    • 确认 Elasticsearch 状态
  3. Kibana 无法访问

    • 检查端口配置
    • 验证 Elasticsearch 连接
    • 查看浏览器控制台错误

调试命令

# 检查 Elasticsearch 状态
curl -X GET "localhost:9200/_cluster/health?pretty"

# 查看索引
curl -X GET "localhost:9200/_cat/indices?v"

# 测试 Logstash 配置
./bin/logstash -f pipeline/logstash.conf --config.test_and_exit

总结

ELK Stack 为 Spring Boot 应用提供了强大的日志分析能力。通过合理的配置和使用,可以实现:

  • 集中化日志管理
  • 实时日志监控
  • 智能告警机制
  • 数据可视化分析
  • 性能问题诊断

建议根据实际业务需求调整配置参数,并定期维护和优化系统性能。

最近更新:: 2025/8/14 09:20
Contributors: Duke
Prev
Kibana 可视化