【spring boot】三種日志系統對比:ELK、Loki+Grafana、Docker API

文章目錄

    • **方案 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 數據源
  1. 訪問 http://localhost:3000,登錄 Grafana(默認賬號 admin/admin)。
  2. 添加 Loki 數據源:
    • URL: http://loki:3100
    • 保存后,在 Explore 頁面查詢日志。
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,具體取決于基礎設施復雜度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91084.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cesium加載3DTiles模型并且重新設置3DTiles模型的高度

代碼&#xff1a; 使用的時候&#xff0c;直接調用 load3DTiles() 方法既可。 // 加載3Dtiles const load3DTiles async () > {let tiles_url "/3DTiles2/Production_1.json";let tileset await Cesium.Cesium3DTileset.fromUrl(tiles_url, {enableCollision: …

Matlab批量轉換1km降水數據為tiff格式

1km降水數據處理- 制作數據裁剪掩膜 0 引言1 示例程序2 結語0 引言 本篇介紹用Matlab工具將中國1km分辨率逐月降水量數據集(1901-2024)批量轉為tiff格式的過程。下面為具體內容: 1 示例程序 下載得到的nc數據(如pre_2001.nc)包含4個字段,其中降水數據的第1個維度為1-12,…

HandyJSON使用詳情

注意事項:Model 需要實現 HandyJSON 協議&#xff0c;對于簡單情況&#xff0c;只需聲明 class/struct 并添加 HandyJSON 協議即可1.簡單 JSON 結構JSON 數據:{"name": "John","age": 30,"isStudent": false }Model 類:struct Person:…

comfyUI-IPApterfaceID人臉特征提取

1.基礎節點 以Checkpoint、CLIP、空Latent、K采樣器、VAE解碼、預覽圖像為基礎節點。 2.人臉特征獲取節點 IPAdapter FaceID節點專用于將特定人臉特征&#xff08;通過參考圖提取&#xff09;融入生成圖像。 參考圖像&#xff0c;正面圖像是想要參考人物的人像&#xff0c;最…

【React Native】Switch、Alert、Dimensions、StatusBar、Image組件

其他常用組件 swich https://reactnative.dev/docs/next/switch alert Alert React Native 如果想增加里面的按鈕&#xff0c;就往這個數組里&#xff0c;按照這個格式不斷的加東西就行了。但是&#xff1a; 在iOS上&#xff0c;里面多少個都有問題&#xff0c;3 個以上它…

滲透筆記1-4

一、HTTPS安全機制 1. HTTP的安全風險 竊聽風險&#xff1a;明文傳輸導致通信內容可被直接截獲&#xff08;如Wireshark抓包獲取密碼&#xff09;。篡改風險&#xff1a;中間人可修改傳輸內容&#xff08;如注入惡意腳本&#xff09;。冒充風險&#xff1a;攻擊者偽造服務端身份…

《星盤接口6:星際聯盟》

《星盤接口6&#xff1a;星際聯盟》? 第一章&#xff1a;新的黎明地球歷2097年&#xff0c;陳欣和她的團隊成功地將“數據之神”封印在一個獨立的數據維度中&#xff0c;暫時解除了對銀河系的威脅。然而&#xff0c;這場勝利并沒有帶來長久的和平。隨著人類文明不斷擴展至更遙…

【安卓筆記】進程和線程的基礎知識

0. 環境&#xff1a; 電腦&#xff1a;Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 先熟悉JVM虛擬機的線程 ----------以下都是系統線程&#xff0c;由JV…

26-計組-多處理器

多處理器的基本概念1. 計算機體系結構分類依據&#xff1a;根據指令流和數據流的數量關系&#xff0c;計算機體系結構可分為四種類型&#xff1a;SISD、SIMD、MISD、MIMD。&#xff08;1&#xff09;SISD 單指令流單數據流定義&#xff1a;任意時刻計算機只能執行單一指令操作單…

vscode 插件開發activityba

在 VS Code 插件開發中&#xff0c;**Activity Bar&#xff08;活動欄&#xff09;**是左側垂直導航欄的核心組成部分&#xff0c;它為用戶提供了快速訪問插件功能的入口。通過自定義 Activity Bar&#xff0c;開發者可以顯著提升插件的可見性和用戶體驗。以下是關于 Activity …

【橘子分布式】Thrift RPC(理論篇)

一、簡介 首先還是那句話&#xff0c;概念網上已經很多了&#xff0c;我們就不多逼逼了。我來大致介紹一下。 Thrift是一個RPC框架可以進行異構系統(服務的提供者 和 服務的調用者 不同編程語言開發系統)的RPC調用為什么在當前的系統開發中&#xff0c;會存在著異構系統的RPC…

項目進度依賴紙面計劃,如何提升計劃動態調整能力

項目進度依賴紙面計劃會導致實際執行中的調整能力不足。提升計劃動態調整能力的方法包括&#xff1a;建立動態進度管理系統、強化團隊溝通與協作、定期開展風險評估與進度復盤。特別是建立動態進度管理系統&#xff0c;通過信息技術工具實現實時跟蹤和反饋&#xff0c;使計劃能…

遞推預處理floor(log_2{n})

在C中&#xff0c;除了使用<cmath>中的log或log2函數求對數&#xff0c;也可以通過遞推求出所有可能用到的?log?2i?,i∈[1,n]\lfloor \log_2i\rfloor, i\in[1, n]?log2?i?,i∈[1,n] 證明&#xff1a;?log?2i??log?2?i2??1\lfloor \log_2i \rfloor\lfloor \…

【AI智能體】智能音視頻-搭建可視化智能體

可視化智能體是語音小伴侶智能體的升級版&#xff0c;支持語音與視頻的雙模態交互。本文詳細介紹了音視頻交互的實現原理、智能體搭建方法及效果測試&#xff0c;幫助開發者快速構建支持音視頻交互的智能體。 應用場景 可視化智能體適用于多種場景&#xff0c;舉例如下&#…

Sensoglove推出新一代外骨骼力反饋手套:主動力反饋+亞毫米級手指追蹤,助力機器人操控與虛擬仿真

在工業自動化、虛擬現實和醫療康復等領域&#xff0c;高精度手部交互設備的需求日益增長。Sensoglove推出的Rembrandt外骨骼力反饋手套&#xff0c;結合主動力反饋、觸覺反饋與亞毫米級追蹤技術&#xff0c;為用戶提供更自然、更安全的操作體驗。Sensoglove外骨骼力反饋手套核心…

AutoMapper入門

在 ASP.NET Core 開發中&#xff0c;我們經常需要在不同層之間傳遞數據&#xff1a;比如從數據庫模型&#xff08;Entity&#xff09;轉換到 DTO&#xff0c;再從 DTO 轉換為前端視圖模型。這些轉換代碼大量重復、冗長、容易出錯。為了解決這個問題&#xff0c;AutoMapper 誕生…

PyTorch武俠演義 第一卷:初入江湖 第1章:武林新秀遇Tensor - 張量基礎

第一卷&#xff1a;初入江湖 第1章&#xff1a;武林新秀遇Tensor - 張量基礎晨起碼農村 雞鳴三聲&#xff0c;林小碼已經收拾好了行囊。他最后看了眼床頭那本翻舊的《Python入門心法》&#xff0c;輕輕撫平卷起的書角。 "小碼&#xff0c;路上小心。"父親將一把青銅匕…

Python進階(4):類與面向對象程序設計

面向對象OOPOOP:Object Oriented Programming,面向對象編程,面向對象中的對象(Obiect)&#xff0c;通常是指客觀世界中存在的對象&#xff0c;這個對象具有唯一性&#xff0c;對象之間各不相同&#xff0c;各有各的特點&#xff0c;每個對象都有自己的運動規律和內部狀態;對象與…

如何在 Shopify 中創建退貨標簽

退貨是電商運營中不可避免的一環&#xff0c;而一個順暢、透明的退貨流程&#xff0c;不僅能減少客戶投訴&#xff0c;也有助于提升顧客對品牌的信任與忠誠度。Shopify 雖然沒有內建退貨標簽自動生成功能&#xff0c;但通過合理設置與外部工具整合&#xff0c;你完全可以打造一…

I2C設備寄存器讀取調試方法

1、查看I2C掛載設備 2、讀取i2C設備所有寄存器 3、讀取i2c設備的某個寄存器 4、向i2C設備某個寄存器寫入一個值1、查看