在編寫應用程序時,我們通常需要對應用程序的運行過程進行記錄,以便在程序出現問題時進行排查和調試。Python 中的 logging 模塊提供了一種靈活且功能強大的記錄方式,可以將記錄輸出到控制臺、文件、網絡等各種位置。 logging 模塊包括四個主要組件:記錄器(Logger)、處理器(Handler)、格式化器(Formatter)和過濾器(Filter)。其中,記錄器是記錄日志信息的主要組件,處理器是用于將記錄器產生的日志信息發(fā)送到不同的位置,格式化器是用于將日志信息格式化為指定的樣式,而過濾器則是用于過濾掉不需要記錄的日志信息。 logging 基本用法在使用 logging 模塊時,通常需要按照以下步驟進行操作: 創(chuàng)建記錄器 import logginglogger = logging.getLogger('my_logger')創(chuàng)建處理器使用 logging.StreamHandler()、logging.FileHandler()、logging.SocketHandler() 等方法創(chuàng)建一個處理器,用于將日志信息發(fā)送到控制臺、文件、網絡等不同位置。pythonCopy codeimport logginglogger = logging.getLogger('my_logger')# 創(chuàng)建一個控制臺處理器console_handler = logging.StreamHandler() 創(chuàng)建格式化器
綁定處理器和格式化器 import logginglogger = logging.getLogger('my_logger')# 創(chuàng)建一個格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 創(chuàng)建一個控制臺處理器console_handler = logging.StreamHandler()console_handler.setFormatter(formatter) 綁定處理器和記錄器
記錄日志信息 import logginglogger = logging.getLogger('my_logger')# 創(chuàng)建一個格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 創(chuàng)建一個控制臺處理器console_handler = logging.StreamHandler()console_handler.setFormatter(formatter)# 綁定處理器和記錄器logger.addHandler(console_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') 上述代碼中,首先創(chuàng)建了一個記錄器 my_logger,然后創(chuàng)建了一個格式化器 % (asctime) s -% (name) s -% (levelname) s -% (message) s,表示記錄日志信息的時間、記錄器的名稱、日志級別和日志內容。然后創(chuàng)建了一個控制臺處理器 console_handler,并將格式化器綁定到處理器上。最后將處理器綁定到記錄器上,并使用記錄器的不同方法記錄了不同級別的日志信息。 在默認情況下,記錄器將所有的日志信息發(fā)送到其直接父級別,直到根記錄器。如果需要將日志信息發(fā)送到其他位置,可以使用不同的處理器,例如 FileHandler、RotatingFileHandler、SMTPHandler 等。還可以通過 setLevel() 方法設置記錄器的日志級別,以便過濾掉不需要記錄的日志信息。此外,還可以使用過濾器來進一步過濾日志信息,只記錄滿足特定條件的日志信息。 logging 高級用法除了基本的記錄日志信息的功能之外,logging 庫還提供了許多高級用法,如下: RotatingFileHandler 根據指定的文件大小,循環(huán)記錄日志信息,如果文件大小超過了指定大小,則將當前日志文件重命名為備份文件,并創(chuàng)建一個新的日志文件繼續(xù)記錄日志信息。使用 maxBytes 參數設置日志文件的最大大小。 TimedRotatingFileHandler 根據指定的時間,循環(huán)記錄日志信息,可以設置循環(huán)周期(例如每天、每小時等)。使用 when 參數設置循環(huán)周期,支持 S、M、H、D、W、midnight 等值,分別表示每秒、每分鐘、每小時、每天、每周、每天午夜等。
上述代碼中,創(chuàng)建了一個 RotatingFileHandler 處理器,指定日志文件名為 my.log,最大大小為 1024 字節(jié),備份文件數量為 3。然后將處理器綁定到記錄器上,并使用記錄器記錄了一條日志信息。 日志郵件通知 import loggingimport logging.handlerslogger = logging.getLogger('my_logger')# 創(chuàng)建一個格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 創(chuàng)建一個 SMTP 處理器mail_handler = logging.handlers.SMTPHandler(mailhost=('smtp.gmail.com', 587), fromaddr='sender@gmail.com', toaddrs='receiver@gmail.com', subject='Test Logging')mail_handler.setFormatter(formatter)# 綁定處理器和記錄器logger.addHandler(mail_handler)# 記錄日志信息logger.error('This is an error message') 上述代碼中,創(chuàng)建了一個 SMTPHandler 處理器,指定了 SMTP 服務器地址、發(fā)件人地址、收件人地址和郵件主題。然后將處理器綁定到記錄器上,并使用記錄器記錄了一條錯誤級別的日志信息。當記錄器記錄了錯誤級別的日志信息時,SMTPHandler 處理器會自動將郵件發(fā)送給指定的收件人。 日志歸檔
上述代碼中,創(chuàng)建了一個 自定義日志處理器 例如,下面的代碼定義了一個 MyHandler 類,可以將日志信息輸出到標準輸出,并在每條日志信息前添加指定的前綴字符串。 import loggingclass MyHandler(logging.Handler): def __init__(self, prefix=''): super().__init__() self.prefix = prefix def emit(self, record): message = self.format(record) message = f'{self.prefix} {message}' print(message) 使用 MyHandler 處理器和 logging 模塊中的其他組件一樣,例如:
上述代碼中,創(chuàng)建了一個 MyHandler 處理器,指定前綴字符串為 [INFO]。然后將處理器綁定到記錄器上,并使用記錄器記錄了一條日志信息。當記錄器記錄日志信息時,MyHandler 處理器會將信息輸出到標準輸出,并在每條信息前添加前綴字符串。 自定義日志過濾器 import loggingclass MyFilter(logging.Filter): def __init__(self, exclude_str=''): super().__init__() self.exclude_str = exclude_str def filter(self, record): message = record.getMessage() return self.exclude_str not in message 使用 MyFilter 過濾器和 logging 模塊中的其他組件一樣,例如:
上述代碼中,創(chuàng)建了一個 MyFilter 過濾器,指定排除包含 warning 字符串的日志信息。然后創(chuàng)建了一個處理器和格式化器,并將過濾器、處理器和記錄器綁定在一起。當記錄器記錄日志信息時,MyFilter 過濾器會過濾掉包含 warning 字符串的日志信息,并將其它日志信息輸出到標準輸出。 日志模塊的配置文件 例如,下面是一個 logging 模塊的配置文件示例 logging.conf: [loggers]keys=root[handlers]keys=consoleHandler,fileHandler[formatters]keys=simpleFormatter[logger_root]level=DEBUGhandlers=consoleHandler,fileHandler[handler_consoleHandler]class=StreamHandlerlevel=DEBUGformatter=simpleFormatterargs=(sys.stdout,)[handler_fileHandler]class=FileHandlerlevel=DEBUGformatter=simpleFormatterargs=('my.log', 'a')[formatter_simpleFormatter]format=%(asctime)s - %(name)s - %(levelname)s - %(message)sdatefmt=%Y-%m-%d %H:%M:%S 上述配置文件定義了一個記錄器 root,它有兩個處理器 consoleHandler 和 fileHandler,使用的格式化器為 simpleFormatter。consoleHandler 處理器將日志信息輸出到標準輸出,fileHandler 處理器將日志信息輸出到文件 my.log 中,文件模式為追加模式。 在 Python 代碼中使用配置文件可以使用 logging.config 模塊中的 fileConfig 函數,例如:
上述代碼中,通過調用 fileConfig 函數加載配置文件 logging.conf,然后獲取 logger 對象并使用它記錄日志信息。 |
|