Python 是一門廣泛用於開發的高級編程語言,其強大的日誌功能是讓開發者更加便捷進行調試的關鍵所在。不同的應用場景需要不同的日誌系統,Python 提供了一系列完善的日誌庫和方便易用的工具來幫助解決不同場景下的日誌需求,這讓 Python 的日誌模塊成為了 Python 編程中不可或缺的一部分。
一、Python 日誌模塊
Python 日誌模塊是 Python 標準庫中的一部分,通過簡單的調用就可以方便地實現日誌的記錄,對於 Python 開發者來說是一個非常重要的日誌系統。Python 日誌模塊的主要是由五大部分構成:Logger,Handler,Filter,Formatter 和 LogRecord。
下面是一個簡單的 Python 日誌模塊的示例:
import logging
# 創建一個logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 創建一個handler,用於寫入日誌文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 創建一個handler,用於輸出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 創建一個formatter,定義日誌輸出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 將handler添加到logger,日誌即可輸出到該handler中
logger.addHandler(fh)
logger.addHandler(ch)
# 記錄一條debug級別的日誌
logger.debug('This is a debug message')
# 記錄一條info級別的日誌
logger.info('This is an info message')
# 記錄一條warning級別的日誌
logger.warning('This is a warning message')
# 記錄一條error級別的日誌
logger.error('This is an error message')
# 記錄一條critical級別的日誌
logger.critical('This is a critical message')
該示例代碼通過調用 Python 的 logging 模塊,並使用 getLogger() 方法創建一個 logger 對象,然後再添加不同級別的 handler,最後使用 logger 以不同級別記錄日誌信息。
二、Python logging 模塊的常用屬性和方法
Logger 對象:
Logger.setLevel(level):設置日誌級別。
Logger.addHandler(hdlr):為該 logger 對象添加一個 handler。
Logger.removeHandler(hdlr):為該 logger 對象刪除一個 handler。
Handler 對象:
Handler.setLevel(level):設置 handler 對象的日誌級別。
Handler.setFormatter(fmt):為 handler 對象設置日誌格式。
Filter 對象:
Filter.filter(record):實現過濾功能,該方法在 logging 模塊源文件中的 Filter 類,參數為 LogRecord 對象,通過比較日誌級別以及一些選項來決定信息是否過濾。
Formatter 對象:
Formatter.format(record):根據 Formatter 對象的設置,格式化 LogRecord 對象,最終輸出日誌記錄的完整字符串。
三、Python 日誌庫的使用案例
案例一:
一個簡單的 Web 應用需要記錄調試信息和報錯信息:
import logging
from logging.handlers import RotatingFileHandler
# 初始化 logging 模塊
logging.basicConfig(level=logging.INFO)
# 創建一個日誌記錄器實例
logger = logging.getLogger('mylogger')
# 創建一個 RotatingFileHandler,設置日誌文件的名稱和路徑,以及日誌文件大小限制和備份數量
handler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024, backupCount=3)
handler.setLevel(logging.INFO)
# 設置記錄器的日誌處理器為剛剛創建的 handler
logger.addHandler(handler)
# 記錄日誌信息
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
上述代碼定義了一個RotatingFileHandler,用於記錄日誌信息。這個Handler類中有一個可以設置日誌大小,日誌個數等信息的參數。當日誌文件達到預定大小之後,就會被輪詢保存,設定的個數就是取決於 backupCount 參數。
案例二:
一個 Web 服務器需要在控制台、文件和遠程服務器上記錄日誌信息:
import logging
import logging.handlers
import socket
class LogstashFormatter(logging.Formatter):
def format(self, record):
# 將日誌格式化為 json 序列化的格式
record.message = record.getMessage()
if isinstance(record.msg, dict):
record.msg = json.dumps(record.msg)
record.hostname = socket.gethostname()
record.pid = os.getpid()
record.level = record.levelname
record.logger_name = record.name
return super(LogstashFormatter, self).format(record)
# 創建 logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 創建 handler,輸出到控制台和文件
stream_handler = logging.StreamHandler()
file_handler = logging.handlers.RotatingFileHandler('myapp.log', maxBytes=10240, backupCount=3)
stream_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.WARNING)
# 創建 remote handler,輸出到遠程服務器
log_server = '192.168.0.1'
remote_handler = logging.handlers.SocketHandler(log_server, logging.handlers.DEFAULT_TCP_LOGGING_PORT)
# Set formatter
formatter = LogstashFormatter("""{"hostname": "%(hostname)s", "pid": "%(process)d", "level": "%(levelname)s", "logger_name": "%(name)s", "message": %(message)s}""")
stream_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
remote_handler.setFormatter(formatter)
# 添加 handler
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
logger.addHandler(remote_handler)
# 記錄日誌信息
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
上述代碼中定義了一個 LogstashFormatter 類,該類重載了日誌的 format 方法,將日誌序列化成為 JSON 格式並記錄在日誌文件中。同時,通過 socket handler 實現將日誌輸出到遠程服務器的功能。
結語
通過 Python logging 模塊,開發者可以方便地實現日誌的記錄和管理。針對不同的應用場景,靈活地選擇日誌記錄器和 handler,可以實現日誌的多樣化輸出。最後,使用 Python 日誌模塊不僅能夠大大提高 Python 開發的效率,而且使得代碼質量更好、更容易維護。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/153236.html
微信掃一掃
支付寶掃一掃