在 Python 中配置日誌記錄到 Syslog
System Logging Protocol 或 Syslog
是用於基於 Unix 的作業系統(例如 macOS 和 Linux)的軟體,是訊息記錄的標準。
Syslog
是一個標準的基於網路的日誌記錄協議,它允許我們將系統日誌和事件訊息傳送到伺服器,稱為 Syslog
伺服器。該服務從多個不同的獨立機器收集日誌訊息和事件訊息,用於分析、監控和評估。
讓我們通過一個例子來理解這項服務。
假設你有五臺計算機。這五臺計算機中的一臺是 Syslog
伺服器。其他四臺計算機是託管四個 Web 應用程式的伺服器。這四個 Web 應用程式相互獨立,並生成一些日誌訊息。
這些日誌訊息包括有關已登入使用者、已登出使用者、哪個使用者訪問了哪個頁面、在哪個頁面發現了什麼錯誤、過去一小時內特定頁面訪問了多少次、線上事務多少次的詳細資訊發生在最後一個小時,依此類推。
由於應用程式和日誌訊息如此之多,跳到單個計算機上並檢視它們是一項複雜的任務,因為應用程式的數量可能更多。因此,所有這些應用程式都將它們的訊息記錄到第五臺計算機或 Syslog
伺服器。
假設有人希望檢視和監控來自多個應用程式的這些日誌訊息。在這種情況下,他們可以從一個地方做到這一點。
這種策略不僅使審查更容易,而且高效且富有成效。甚至可以開發應用程式來根據他們的品味和要求來審查和監控這些日誌訊息,或者使用市場上現有的產品。
Python 程式語言是一種通用語言,可以構建現實世界的應用程式。本文將使用 Python 處理將訊息記錄到 Syslog
。
使用 Python 中的 Syslog
模組將訊息記錄到 syslog
我們可以使用 Python 模組 syslog
記錄訊息。它是 Python 標準庫的一部分,充當 Unix syslog
庫例程的介面。
這個模組有兩個同名的方法,syslog()
,可以記錄訊息。這裡用到了函式過載的概念。
以下是這兩種方法的函式簽名。
syslog.syslog(message)
syslog.syslog(priority, message)
第一種方法接受字串訊息,第二種方法接受字串訊息和優先順序。這兩種方法都向系統記錄器傳送字串訊息。
此模組中有八個可用的優先順序,按從高到低的順序排列如下。
LOG_EMERG
-syslog.LOG_EMERG
:用於緊急情況。LOG_ALERT
-syslog.LOG_ALERT
:用於警報。LOG_CRIT
-syslog.LOG_CRIT
:用於關鍵訊息。LOG_ERR
-syslog.LOG_ERR
:用於錯誤。LOG_WARNING
-syslog.LOG_WARNING
:用於警告。LOG_NOTICE
-syslog.LOG_NOTICE
:用於通知。LOG_INFO
-syslog.LOG_INFO
:用於資訊性訊息。LOG_DEBUG
-syslog.LOG_DEBUG
:用於除錯訊息。
我們現在完成了對該模組的一些簡明介紹。讓我們通過一個例子來了解如何使用這個模組。請參閱以下 Python 程式碼。
import syslog
syslog.syslog("A test message.")
syslog.syslog(syslog.LOG_EMERG, "A message with LOG_EMERG priority.")
syslog.syslog(syslog.LOG_ALERT, "A message with LOG_ALERT priority.")
syslog.syslog(syslog.LOG_CRIT, "A message with LOG_CRIT priority.")
syslog.syslog(syslog.LOG_ERR, "A message with LOG_ERR priority.")
syslog.syslog(syslog.LOG_WARNING, "A message with LOG_WARNING priority.")
syslog.syslog(syslog.LOG_NOTICE, "A message with LOG_NOTICE priority.")
syslog.syslog(syslog.LOG_INFO, "A message with LOG_INFO priority.")
syslog.syslog(syslog.LOG_DEBUG, "A message with LOG_DEBUG priority.")
syslog.syslog(syslog.LOG_INFO, "Test message with INFO priority.")
使用 Python 中的 logging
模組將訊息記錄到 Syslog
Python 還有另一個模組 logging
,其中包含通過靈活的事件日誌系統幫助應用程式和庫的方法和類。
該模組也是 Python 標準庫的一部分。logging
模組為事件記錄提供了許多功能和靈活性。
logging
模組有一個 Logger
類,其中包含實際日誌記錄邏輯的實現。開發人員和程式設計師必須例項化此類以執行日誌記錄。
請注意,永遠不應直接例項化此類。必須使用模組級函式 getLogger()
或 logging.getLogger(name)
來建立記錄器。
這裡,name
是記錄器的名稱。Logger
類有許多方法,例如 propogate()
、setLevel()
、isEnabledFor()
、getEffectiveLevel()
和 log()
。
為了本文的目的,我們將只關注以下方法。
debug(msg)
:一種記錄級別DEBUG
的訊息的方法。info(msg)
:一種記錄級別INFO
的訊息的方法。warning(msg)
:一種記錄級別WARNING
的訊息的方法。error(msg)
:一種記錄級別ERROR
的訊息的方法。critical(msg)
:一種記錄級別CRITICAL
的訊息的方法。log(level, msg)
:一種以指定整數級別記錄訊息的方法。exception(msg)
:一種記錄級別ERROR
的訊息的方法。addHandler(hdlr)
:一種將指定處理程式新增到記錄器的方法。
該庫具有以下日誌記錄級別及其數值。
CRITICAL
:50
ERROR
:40
WARNING
:30
INFO
:20
DEBUG
:10
NOTSET
:0
日誌模組有一個類 Handler
,用於指定日誌訊息的位置。在上面討論的 addHandler()
方法的幫助下,Handler
類物件被新增到記錄器中。
除了這兩個類之外,logging
模組還有兩個類,即 Formatter
和 Filter
。Formatter
類用於定義日誌訊息的佈局和格式,Filter
類用於過濾日誌訊息。
目前,這就是我們對這些功能的全部瞭解。
現在我們完成了對 logging
模組的簡要介紹;讓我們通過示例瞭解如何使用此模組記錄訊息。請參閱以下 Python 程式碼。
import logging
from logging.handlers import SysLogHandler
logger = logging.getLogger("Logger")
handler = SysLogHandler(address="/var/run/syslog")
logger.addHandler(handler)
logger.debug("A message with level DEBUG.")
logger.info("A message with level INFO.")
logger.warning("A message with level WARNING.")
logger.error("A message with level ERROR.")
logger.critical("A message with level CRITICAL.")
logger.exception("A message with level ERROR.")
logger.log(250, "A message with level 250 numeric value.")
上面的 Python 指令碼首先在 getLogger()
方法的幫助下建立了一個記錄器,並提供了名稱 Logger
。
接下來,它使用 SysLogHandler
類建立一個處理程式。此類允許開發人員和程式設計師將日誌訊息傳送到遠端或本地 Unix syslog
。
這個類接受一個引數(三個引數之一),address
,它指的是日誌訊息的目的地。要詳細瞭解這個類,請參考官方文件這裡。
然後,我們在 addHandler()
方法的幫助下將此處理程式新增到記錄器。最後,使用上面討論的所有日誌記錄方法,我們記錄所有級別的訊息,其中一個級別為 250
。