以 Python 日誌為中心的開發實踐

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-tw/n/153236.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-14 03:04
下一篇 2024-11-14 03:04

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論