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」分頁,請確認您正在查看過去一小時的日誌,並將畫面設定為每秒自動更新,以即時看到新訊息。