# log-d **Repository Path**: chef_git/log-d ## Basic Information - **Project Name**: log-d - **Description**: websocket实现实时日志推流展示 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-23 - **Last Updated**: 2026-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Log-D · Java WebSocket 实时日志系统 > 基于 Spring Boot + WebSocket + MinIO 构建的高质量实时日志采集与展示系统。 ## 功能一览 | 功能 | 说明 | |------|------| | **实时推送** | WebSocket 广播,毫秒级日志展示 | | **多客户端** | 支持同时多个浏览器连接,自动断线重连 | | **内存缓冲** | `LinkedBlockingQueue` 无锁缓冲,防止 OOM | | **定时持久化** | 双触发策略写入 MinIO(时间间隔 + 积压阈值) | | **日志滚动** | 按日期目录 + 序号文件自动滚动,每文件上限可配 | | **前端展示** | 级别过滤、关键字高亮、跟随滚动、速率统计、暂停 | ## 项目结构 ``` log-d/ ├── pom.xml └── src/main/ ├── java/com/logd/ │ ├── LogDApplication.java # 启动类 │ ├── config/ │ │ ├── WebSocketConfig.java # WebSocket 配置 │ │ └── MinioConfig.java # MinIO 客户端配置(自动建桶) │ ├── model/ │ │ └── LogEntry.java # 日志条目模型 │ ├── websocket/ │ │ └── LogWebSocketServer.java # WS 服务端(连接管理 + 广播) │ ├── service/ │ │ ├── LogCollectorService.java # 日志收集 + 内存缓冲 │ │ └── LogController.java # REST 管理接口 │ ├── minio/ │ │ └── MinioLogWriter.java # MinIO 批量写入 │ └── task/ │ ├── LogFlushTask.java # 定时刷写任务(双触发) │ └── MockLogProducerTask.java # 模拟日志生产者(演示用) └── resources/ ├── application.yml └── static/ └── index.html # 前端实时日志页面 ``` ## 快速启动 ### 前置条件 - JDK 11+ - Maven 3.6+ - MinIO 实例(本地开发可用 Docker 快速启动) ### 启动 MinIO(Docker) ```bash docker run -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USER=minioadmin \ -e MINIO_ROOT_PASSWORD=minioadmin \ minio/minio server /data --console-address ":9001" ``` ### 修改配置 编辑 `src/main/resources/application.yml`: ```yaml minio: endpoint: http://localhost:9000 # MinIO 地址 access-key: minioadmin secret-key: minioadmin bucket-name: log-d logd: flush-size: 200 # 积压多少条触发写入 flush-interval-seconds: 30 # 最长多少秒强制写入一次 max-lines-per-file: 5000 # 每个对象最多行数 ``` ### 编译运行 ```bash cd log-d mvn clean package -DskipTests java -jar target/log-d-1.0.0.jar ``` 或直接用 IDE 运行 `LogDApplication.main()`。 ### 访问 | 地址 | 说明 | |------|------| | `http://localhost:8080` | 实时日志前端页面 | | `ws://localhost:8080/ws/log/{clientId}` | WebSocket 端点 | | `GET /api/log/status` | 系统状态(在线数、队列积压) | | `POST /api/log/flush` | 手动触发 MinIO 写入 | | `POST /api/log/publish` | 手动发布测试日志 | ## 接入业务代码 注入 `LogCollectorService`,调用对应方法即可: ```java @Autowired private LogCollectorService logCollector; // 各级别日志 logCollector.info("order-service", "订单创建成功: orderId=12345"); logCollector.warn("pay-service", "支付超时,准备重试"); logCollector.error("db", "连接池耗尽"); // 或构建完整 Entry logCollector.publish(LogEntry.of("INFO", "my-service", "自定义日志内容")); ``` > 生产环境中可删除 `MockLogProducerTask`,使用真实业务日志。 ## MinIO 日志路径规则 ``` {bucket}/logs/{yyyy-MM-dd}/log-{序号4位}.txt 示例:log-d/logs/2025-01-15/log-0001.txt log-d/logs/2025-01-15/log-0002.txt ← 超过 max-lines-per-file 时滚动 ``` ## 前端功能说明 - **级别过滤**:点击 ALL / INFO / WARN / ERROR / DEBUG 快速切换 - **关键字搜索**:实时高亮匹配文本,200ms 防抖 - **暂停 / 继续**:暂停期间的日志暂不渲染(统计仍在更新) - **跟随 / 取消**:手动向上滚动时自动取消跟随;点按钮重新开启 - **清空**:清空当前显示(不影响 MinIO 历史数据) - **速率统计**:底部统计栏实时显示每秒接收条数