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 library。首先,請使用 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 並排在第一順位。
- 在 Graylog 管理介面的「Search」分頁,請確認正在查看過去一小時的日誌,並將檢視設定為每秒自動更新,以便即時看到新訊息。