大約五年來,我一直面臨著收集日誌的任務,通常是來自小型到中型的程式碼庫。從程式碼發送日誌不是問題:Java 和 Go 幾乎都有現成的函式庫可用。但部署一些東西來收集它們卻是一個頭痛的問題。我明白這是一個可解決的任務(甚至在 ChatGPT 之前,現在更是如此)。然而,所有的日誌系統主要都是針對大型企業世界及其需求而設計的,而不是針對只有幾根棍子、膠水和「昨天」截止日期的小團隊或單個開發人員。
每次啟動 ELK 對我來說都是一個挑戰:一堆設置,一個不簡單的部署,當我進入 UI 時,我的眼睛被那些標籤頁弄得眼花繚亂。使用 Loki 和 Graylog 會稍微容易一些,但仍然有比我需要的多得多的功能。同時,在專案之間分離日誌並向系統添加其他用戶,使他們看不到不應該看到的內容,也不是最明顯的過程。
所以大約一年前,我決定製作自己的日誌收集系統。一個盡可能易於使用和啟動的系統。它可以通過單個命令部署在伺服器上,無需任何配置或介面中不必要的標籤頁。這就是 Log Bull 的由來,現在它是開源的:一個為擁有中型專案的開發人員設計的日誌收集系統。
目錄:
Log Bull 是一個強調易用性的日誌收集系統(最小配置,最少功能,啟動時零配置)。該專案完全在 Apache 2.0 許可下開源。我的主要優先事項是創建一個解決方案,使初級開發人員能夠輕鬆弄清楚如何啟動系統,如何向其發送日誌,以及如何在大約 15 分鐘內查看它們。
專案的主要特點:
https://www.youtube.com/watch?v=8H8jF8nVzJE&embedable=true
該專案使用 Go 開發,並建立在 OpenSearch 上。
專案網站 - https://logbull.com
專案 GitHub - https://github.com/logbull/logbull
P.S. 如果您覺得這個專案有用並且擁有 GitHub 帳戶,請給它一個星星 ⭐️。最初的星星很難收集。我將非常感謝您的支持!
部署專案有三種方式:通過 .sh 腳本(我推薦的方式)、通過 Docker 和通過 Docker Compose。
方法 1:通過腳本安裝
該腳本將安裝 Docker,將專案放在 /opt/logbull 文件夾中,並在系統重新啟動時配置自動啟動。安裝命令:
sudo apt-get install -y curl && \ sudo curl -sSL https://raw.githubusercontent.com/logbull/logbull/main/install-logbull.sh \ | sudo bash
方法 2:通過 Docker Compose 啟動
創建 docker-compose.yml 文件,內容如下:
services: logbull: container_name: logbull image: logbull/logbull:latest ports: - "4005:4005" volumes: - ./logbull-data:/logbull-data restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4005/api/v1/system/health"] interval: 5s timeout: 5s retries: 30
然後運行命令 docker compose up -d
。系統將在 4005 端口上啟動。
方法 3:通過 Docker 命令啟動
在終端中運行以下命令(系統也將在 4005 端口上啟動):
docker run -d \ --name logbull \ -p 4005:4005 \ -v ./logbull-data:/logbull-data \ --restart unless-stopped \ --health-cmd="curl -f http://localhost:4005/api/v1/system/health || exit 1" \ --health-interval=5s \ --health-retries=30 \ logbull/logbull:latest
我設計這個專案時考慮到了便利性,主要是為了開發人員。這就是為什麼我為大多數流行的開發語言創建了函式庫。我這樣做的想法是,Log Bull 可以作為處理器連接到任何流行的函式庫,而無需更改當前的程式碼庫。
我強烈建議查看網站上的示例,因為那裡有一個用於選擇語言的互動面板:
讓我們以 Python 為例。首先,您需要安裝函式庫(雖然您也可以通過 HTTP 發送;有 cURL 的示例):
pip install logbull
然後從程式碼發送:
import time from logbull import LogBullLogger # Initialize logger logger = LogBullLogger( host="http://LOGBULL_HOST", project_id="LOGBULL_PROJECT_ID", ) # Log messages (printed to console AND sent to LogBull) logger.info("User logged in successfully", fields={ "user_id": "12345", "username": "john_doe", "ip": "192.168.1.100" }) # With context session_logger = logger.with_context({ "session_id": "sess_abc123", "user_id": "user_456" }) session_logger.info("Processing request", fields={ "action": "purchase" }) # Ensure all logs are sent before exiting logger.flush() time.sleep(5)
所有日誌都會立即顯示在主屏幕上。您可以:
減少消息的大小(通過將行截斷到約 50-100 個字符)。
展開發送字段的列表(user_id、order_id 等)。
點擊字段並將其添加到過濾器中。使用條件搜索日誌:
您還可以收集條件組(例如,消息包含某些文本,但排除特定伺服器 IP 地址)。
我希望我的日誌收集系統對那些不想或不能(由於專案資源有限)實施「重量級」解決方案(如 ELK)的開發人員有所幫助。我已經在生產專案中使用 Log Bull,一切進展順利。我歡迎在 GitHub 上提供反饋、改進建議和問題報告。