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 函式庫。請先透過 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」分頁,請確認正在檢視最近一小時的日誌,並將畫面設定為每秒自動更新,以即時看到新訊息。