文章目錄
- **方案 1:使用 ELK(Elasticsearch + Logstash + Kibana)**
- **適用場景**
- **搭建步驟**
- **1. 修改 Spring Boot 日志輸出**
- **2. 創建 Docker Compose 文件**
- **3. 配置 Logstash**
- **4. 啟動服務**
- **方案 2:使用 Loki + Grafana**
- **適用場景**
- **搭建步驟**
- **1. 修改 Spring Boot 日志驅動**
- **2. 配置 Grafana 數據源**
- **3. 查看日志**
- **方案 3:直接通過 Docker 日志 API + WebSocket 實時推送**
- **適用場景**
- **搭建步驟**
- **1. 創建 Spring Boot 日志接口**
- **2. 前端頁面**
- **3. 訪問日志頁面**
- **方案對比**
- **推薦選擇**
在 Spring Boot 項目運行于 Docker 容器時,若需要在頁面上查看實時控制臺日志,可通過以下幾種方案實現。以下是每種方案的詳細搭建步驟:
方案 1:使用 ELK(Elasticsearch + Logstash + Kibana)
適用場景
- 需要集中式日志管理、搜索和分析能力。
- 適合生產環境,支持多節點日志聚合。
搭建步驟
1. 修改 Spring Boot 日志輸出
確保應用日志輸出為 JSON 格式(便于 Logstash 解析):
# application.properties
logging.pattern.console={"time":"%d{yyyy-MM-dd HH:mm:ss.SSS}","level":"%level","service":"${spring.application.name}","thread":"%thread","message":"%msg"}%n
2. 創建 Docker Compose 文件
docker-compose-elk.yml
:
version: '3'
services:spring-boot-app:image: your-spring-boot-app:latestenvironment:- SPRING_PROFILES_ACTIVE=dockerports:- "8080:8080"logging:driver: "json-file"options:max-size: "10m"max-file: "3"elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:8.7.0environment:- discovery.type=single-node- xpack.security.enabled=falseports:- "9200:9200"volumes:- es_data:/usr/share/elasticsearch/datalogstash:image: docker.elastic.co/logstash/logstash:8.7.0ports:- "5000:5000"volumes:- ./logstash.conf:/usr/share/logstash/pipeline/logstash.confdepends_on:- elasticsearchkibana:image: docker.elastic.co/kibana/kibana:8.7.0ports:- "5601:5601"depends_on:- elasticsearchvolumes:es_data:
3. 配置 Logstash
創建 logstash.conf
:
input {tcp {port => 5000codec => json_lines}
}
output {elasticsearch {hosts => ["elasticsearch:9200"]index => "spring-logs-%{+YYYY.MM.dd}"}
}
4. 啟動服務
docker-compose -f docker-compose-elk.yml up
訪問 Kibana 查看日志:
http://localhost:5601
方案 2:使用 Loki + Grafana
適用場景
- 輕量級日志收集,適合云原生環境。
- 與 Prometheus 監控棧集成。
搭建步驟
1. 修改 Spring Boot 日志驅動
docker-compose.yml
:
version: '3'
services:spring-boot-app:image: your-spring-boot-app:latestlogging:driver: "loki"options:loki-url: "http://loki:3100/loki/api/v1/push"loki:image: grafana/loki:2.7.0ports:- "3100:3100"grafana:image: grafana/grafana:9.5.0ports:- "3000:3000"depends_on:- loki
2. 配置 Grafana 數據源
- 訪問
http://localhost:3000
,登錄 Grafana(默認賬號admin/admin
)。 - 添加 Loki 數據源:
- URL:
http://loki:3100
- 保存后,在 Explore 頁面查詢日志。
- URL:
3. 查看日志
在 Grafana 的 Explore 頁面輸入查詢:
{container_name="spring-boot-app"}
方案 3:直接通過 Docker 日志 API + WebSocket 實時推送
適用場景
- 簡單場景,僅需實時查看單個容器日志。
- 適合開發調試。
搭建步驟
1. 創建 Spring Boot 日志接口
@RestController
public class LogController {@GetMapping("/logs")public SseEmitter streamLogs() throws IOException {SseEmitter emitter = new SseEmitter();Process process = Runtime.getRuntime().exec("docker logs -f your-container-id");BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));new Thread(() -> {String line;try {while ((line = reader.readLine()) != null) {emitter.send(SseEmitter.event().data(line));}} catch (IOException e) {emitter.completeWithError(e);}}).start();return emitter;}
}
2. 前端頁面
<!DOCTYPE html>
<html>
<body><pre id="logs"></pre><script>const eventSource = new EventSource("/logs");eventSource.onmessage = (e) => {document.getElementById("logs").innerHTML += e.data + "\n";};</script>
</body>
</html>
3. 訪問日志頁面
http://localhost:8080/logs-page
方案對比
方案 | 適用場景 | 復雜度 | 實時性 | 生產可用性 |
---|---|---|---|---|
ELK | 生產環境,多節點 | 高 | ?? | ?? |
Loki+Grafana | 云原生,輕量級 | 中 | ?? | ?? |
Docker API | 開發調試,單容器 | 低 | ?? | ? |
推薦選擇
- 開發環境:直接使用 Docker API 或
docker logs -f
。 - 生產環境:使用 ELK 或 Loki+Grafana,具體取決于基礎設施復雜度。