Graylog: 使用 Python
如何從 Python 傳送日誌到 Graylog
👋 歡迎來到 Stackhero 文件!
Stackhero 提供一個即用型的 Graylog cloud 解決方案,帶來多項好處,包括:
- 包含無限和專用的 SMTP 電郵伺服器。
- 只需一鍵即可輕鬆更新。
- 使用 HTTPS 保護的可自訂域名(例如,https://logs.your-company.com)。
- 由專用私有 VM提供的最佳性能和強大安全性。
節省時間並簡化您的生活:只需 5 分鐘即可嘗試 Stackhero 的 Graylog cloud hosting 解決方案!
從 Python 傳送日誌到 Graylog 是一個簡單的流程。本指南將說明如何使用 graypy 與 logging 套件,將您的 Python 應用程式日誌轉發到 Graylog 實例。
設定 Graylog
首先,您需要在 Graylog 伺服器上設定一個 GELF TCP 輸入。
請進入 Graylog 管理後台。在「System」>「Inputs」中,建立一個新的「GELF TCP」類型輸入。請勾選「global」選項,輸入一個「title」作為輸入名稱,並確認連接埠設為 12201。
請不要在這裡啟用任何 TLS 選項。TLS 加密會由您的實例所附帶的反向代理(reverse proxy)處理。
Input configuration
在 Stackhero 設定您的服務
在 Stackhero 控制台中,選擇您的 Graylog 服務並點擊「Configure」。
請確認 TCP 12201 埠已正確設定,且此埠已啟用「TLS encryption」。儲存您的變更以套用設定。
Input port configuration
請在服務的「Firewall」中確認,至少已允許您的 IP 傳送資料到 TCP 12201 埠。測試時,建議暫時允許所有 IP(0.0.0.0/0),這也是預設設定。
範例:從 Python 傳送日誌
本範例將使用 graypy 函式庫。請先透過 pip install graypy 安裝。
接著,建立一個名為 graylog-example.py 的檔案,並將 <XXXXXX>.stackhero-network.com 替換為您自己的伺服器主機名稱。以下是一個範例腳本:
import logging
import graypy
my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)
handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)
my_logger.debug('This is a test from a Python script!')
要查看您的日誌,請開啟 Graylog 管理後台,進入「Search」分頁,點擊播放圖示,並將更新頻率設為每秒。您可以用以下指令執行腳本:
python graylog-example.py
腳本執行後,您的日誌訊息會傳送到 Graylog,您應該可以在搜尋結果中看到它。
Your first log received on Graylog
點擊訊息「This is a test from a Python script!」後,您可以看到詳細資訊,例如腳本名稱與產生日誌的確切行數。
Detailed log
傳送錯誤日誌
Graylog 不僅能處理一般日誌訊息,也能捕捉並轉發錯誤,讓您更容易掌握應用程式行為。這有助於監控並透過 Email、Slack 或 Mattermost 等方式接收問題通知。
以下範例會故意呼叫不存在的函式以產生錯誤。請記得將「<XXXXXX>.stackhero-network.com」替換為您的實例主機名稱。
import logging
import graypy
my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)
handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)
try:
unknown_function()
except NameError:
my_logger.debug('The "unknown_function" raised an error', exc_info=1)
您可以如前述方式執行此腳本。在 Graylog 管理後台,您會看到錯誤訊息「NameError: name 'unknown_function' is not defined」以及完整的堆疊追蹤(stack trace)。
Error log example
強化通訊安全性
雖然前述範例已使用 TLS 加密,但並未進行憑證驗證。這在測試時尚可,但在正式環境中,務必驗證憑證有效性。
您可以透過加入 validate 與 ca_certs 參數來啟用憑證驗證,如下所示:
handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201, validate=True, ca_certs='/etc/ssl/certs/ca-certificates.crt')
請確認 /etc/ssl/certs/ca-certificates.crt 檔案存在於您的系統:
- 在 Ubuntu/Debian 上,可用
sudo apt install ca-certificates安裝。 - 在 Alpine Linux 上,請用
apk add ca-certificates安裝。 - 在 macOS 上,預設已安裝,但檔案名稱為
/etc/ssl/cert.pem。
疑難排解
如果您在 Graylog 看不到日誌,請檢查以下幾點:
- 確認 Graylog 已有一個 GELF TCP 輸入監聽 12201 埠,且此輸入未啟用 TLS。
- 在 Stackhero 控制台的「Configure」中,確認 12201 埠已設定為 TCP 並於「Input ports」啟用 TLS。
- 檢查 Stackhero 的防火牆設定,確保「12201/tcp」已設為「ACCEPT」,建議測試時將來源設為 0.0.0.0/0 並排在第 1 順位。
- 在 Graylog 管理後台的「Search」分頁,請確認您正在檢視最近一小時的日誌,並將檢視設定為每秒自動更新,以即時看到新訊息。