Graylog: 使用 Python

如何從 Python 發送日誌到 Graylog

👋 歡迎來到 Stackhero 文件!

Stackhero 提供即用型的 Graylog cloud 解決方案,帶來多項好處,包括:

  • 包含無限和專用的 SMTP 電郵伺服器
  • 只需一鍵即可輕鬆更新
  • 使用 HTTPS 保護的可自訂域名(例如,https://logs.your-company.com)。
  • 專用私有 VM提供的最佳性能和強大安全性

節省時間簡化您的生活:只需 5 分鐘即可嘗試 Stackhero 的 Graylog cloud hosting 解決方案!

從 Python 發送日誌到 Graylog 是一個簡單的流程。本文將說明如何利用 graypylogging 套件,將您的 Python 應用程式的日誌轉發到 Graylog 實例。

首先,您需要在 Graylog 伺服器上設定一個 GELF TCP 輸入。

請登入 Graylog 管理介面。在「System」>「Inputs」中,建立一個新的「GELF TCP」類型輸入。請勾選「global」選項,輸入一個「title」作為輸入名稱,並確認連接埠設為 12201。

不要在這裡啟用任何 TLS 選項。TLS 加密會由您的實例所包含的反向代理(reverse proxy)處理。

Input configurationInput configuration

於 Stackhero 控制台中,選擇您的 Graylog 服務並點擊「Configure」。

請確認 TCP 12201 連接埠已正確設定,並且此連接埠已啟用「TLS encryption」。儲存設定以套用變更。

Input port configurationInput port configuration

請在服務的「Firewall」中確認,至少已允許您的 IP 傳送資料到 TCP 12201 連接埠。測試時,建議可暫時允許所有 IP(0.0.0.0/0),這也是預設設定。

本範例將使用 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 GraylogYour first log received on Graylog

點擊訊息「This is a test from a Python script!」後,您可以看到詳細資訊,例如腳本名稱及產生日誌的確切程式碼行數。

Detailed logDetailed 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 exampleError log example

雖然上述範例已使用 TLS 加密,但並未進行憑證驗證。這在測試環境下尚可,但在正式環境中,務必驗證憑證的有效性

您可透過加入 validateca_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 看不到日誌,請檢查以下幾點:

  1. 確認 Graylog 已有一個 GELF TCP 輸入監聽 12201 連接埠,且此輸入啟用 TLS。
  2. 在 Stackhero 控制台的「Configure」中,確認 12201 連接埠已設為 TCP 並於「Input ports」啟用 TLS。
  3. 檢查 Stackhero 的防火牆設定,確保「12201/tcp」已設為「ACCEPT」,建議測試時將來源設為 0.0.0.0/0 並排在第一順位。
  4. 在 Graylog 管理介面的「Search」分頁,請確認正在查看過去一小時的日誌,並將檢視設定為每秒自動更新,以便即時看到新訊息。