一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

【Python】自動化編程之基礎庫 logging 庫

 禁忌石 2023-02-17 發(fā)布于浙江

在編寫應用程序時,我們通常需要對應用程序的運行過程進行記錄,以便在程序出現問題時進行排查和調試。Python 中的 logging 模塊提供了一種靈活且功能強大的記錄方式,可以將記錄輸出到控制臺、文件、網絡等各種位置。

logging 模塊包括四個主要組件:記錄器(Logger)、處理器(Handler)、格式化器(Formatter)和過濾器(Filter)。其中,記錄器是記錄日志信息的主要組件,處理器是用于將記錄器產生的日志信息發(fā)送到不同的位置,格式化器是用于將日志信息格式化為指定的樣式,而過濾器則是用于過濾掉不需要記錄的日志信息。

logging 基本用法

在使用 logging 模塊時,通常需要按照以下步驟進行操作:

創(chuàng)建記錄器
使用 logging.getLogger(name) 方法創(chuàng)建一個記錄器,其中 name 是記錄器的名稱,可以根據需要自行命名。如果不指定名稱,則使用根記錄器。

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)建格式化器
使用 logging.Formatter() 方法創(chuàng)建一個格式化器,用于將日志信息格式化為指定的樣式。

import logginglogger = logging.getLogger('my_logger')# 創(chuàng)建一個格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

綁定處理器和格式化器
使用處理器的 setFormatter() 方法將格式化器綁定到處理器上。

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)

綁定處理器和記錄器
使用記錄器的 addHandler() 方法將處理器綁定到記錄器上。

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)

記錄日志信息
使用記錄器的 debug()、info()、warning()、error()、critical() 等方法記錄日志信息。

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 庫還提供了許多高級用法,如下:
日志輪換
logging.handlers 模塊提供了多種處理器,其中 RotatingFileHandler 和 TimedRotatingFileHandler 可以實現日志輪換的功能。

RotatingFileHandler 根據指定的文件大小,循環(huán)記錄日志信息,如果文件大小超過了指定大小,則將當前日志文件重命名為備份文件,并創(chuàng)建一個新的日志文件繼續(xù)記錄日志信息。使用 maxBytes 參數設置日志文件的最大大小。

TimedRotatingFileHandler 根據指定的時間,循環(huán)記錄日志信息,可以設置循環(huán)周期(例如每天、每小時等)。使用 when 參數設置循環(huán)周期,支持 S、M、H、D、W、midnight 等值,分別表示每秒、每分鐘、每小時、每天、每周、每天午夜等。

import loggingimport logging.handlerslogger = logging.getLogger('my_logger')# 創(chuàng)建一個格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 創(chuàng)建一個輪換文件處理器file_handler = logging.handlers.RotatingFileHandler('my.log', maxBytes=1024, backupCount=3)file_handler.setFormatter(formatter)# 綁定處理器和記錄器logger.addHandler(file_handler)# 記錄日志信息logger.info('This is a test message')

上述代碼中,創(chuàng)建了一個 RotatingFileHandler 處理器,指定日志文件名為 my.log,最大大小為 1024 字節(jié),備份文件數量為 3。然后將處理器綁定到記錄器上,并使用記錄器記錄了一條日志信息。

日志郵件通知
使用 SMTPHandler 處理器可以實現將日志信息通過電子郵件發(fā)送給指定的收件人。

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ā)送給指定的收件人。

日志歸檔
logging.handlers 模塊還提供了 RotatingFileHandler 和 TimedRotatingFileHandler 的派生類,可以將歷史日志信息歸檔到不同的文件中。
例如,RotatingFileHandler 的派生類
ConcurrentRotatingFileHandler 可以將歷史日志信息歸檔到不同的文件中,歸檔的文件名可以包含時間信息和序號信息。使用 filename 參數設置歸檔文件名的格式,例如:

import loggingimport logging.handlerslogger = logging.getLogger('my_logger')# 創(chuàng)建一個格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 創(chuàng)建一個并發(fā)輪換文件處理器file_handler = logging.handlers.ConcurrentRotatingFileHandler('my.log', maxBytes=1024, backupCount=3, filename='my_%Y%m%d_%H%M%S.log')file_handler.setFormatter(formatter)# 綁定處理器和記錄器logger.addHandler(file_handler)# 記錄日志信息logger.info('This is a test message')

上述代碼中,創(chuàng)建了一個
ConcurrentRotatingFileHandler 處理器,指定日志文件名為 my.log,最大大小為 1024 字節(jié),備份文件數量為 3,歸檔文件名格式為 my_年月日_時分秒.log。然后將處理器綁定到記錄器上,并使用記錄器記錄了一條日志信息。當日志文件大小超過指定大小時,會自動將當前日志文件歸檔到一個新的文件中。

自定義日志處理器
logging.handlers 模塊提供了多種日志處理器,但有時候需要自定義特定的日志處理器來滿足特定的需求。可以通過繼承 logging.Handler 類并重寫其方法來實現自定義日志處理器。

例如,下面的代碼定義了一個 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 模塊中的其他組件一樣,例如:

logger = logging.getLogger('my_logger')# 創(chuàng)建一個 MyHandler 處理器handler = MyHandler(prefix='[INFO]')handler.setLevel(logging.INFO)# 創(chuàng)建一個格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)# 綁定處理器和記錄器logger.addHandler(handler)# 記錄日志信息logger.info('This is a test message')

上述代碼中,創(chuàng)建了一個 MyHandler 處理器,指定前綴字符串為 [INFO]。然后將處理器綁定到記錄器上,并使用記錄器記錄了一條日志信息。當記錄器記錄日志信息時,MyHandler 處理器會將信息輸出到標準輸出,并在每條信息前添加前綴字符串。

自定義日志過濾器
logging.Filter 類可以用于定義日志過濾器,根據需要過濾掉一些不需要記錄的日志信息??梢酝ㄟ^繼承 logging.Filter 類實現自定義日志過濾器。
例如,下面的代碼定義了一個 MyFilter 類,可以過濾掉日志信息中包含指定字符串的記錄。

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 模塊中的其他組件一樣,例如:

logger = logging.getLogger('my_logger')# 創(chuàng)建一個過濾器filter = MyFilter(exclude_str='warning')filter.setLevel(logging.WARNING)# 創(chuàng)建一個處理器handler = logging.StreamHandler()handler.setLevel(logging.DEBUG)# 創(chuàng)建一個格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)# 綁定過濾器、處理器和記錄器handler.addFilter(filter)logger.addHandler(handler)# 記錄日志信息logger.info('This is a test message')logger.warning('This is a warning message')

上述代碼中,創(chuàng)建了一個 MyFilter 過濾器,指定排除包含 warning 字符串的日志信息。然后創(chuàng)建了一個處理器和格式化器,并將過濾器、處理器和記錄器綁定在一起。當記錄器記錄日志信息時,MyFilter 過濾器會過濾掉包含 warning 字符串的日志信息,并將其它日志信息輸出到標準輸出。

日志模塊的配置文件
logging 模塊可以使用配置文件來配置日志記錄器、處理器、格式化器和過濾器等組件的參數,這樣可以方便地在多個應用程序中重復使用配置。

例如,下面是一個 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 函數,例如:

import logging.configlogging.config.fileConfig('logging.conf')logger = logging.getLogger('root')logger.info('This is a test message')

上述代碼中,通過調用 fileConfig 函數加載配置文件 logging.conf,然后獲取 logger 對象并使用它記錄日志信息。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩精品日韩激情日韩综合| 欧美中文字幕一区在线| 亚洲欧美国产网爆精品| 日韩欧美黄色一级视频| 少妇被粗大进猛进出处故事| 熟女中文字幕一区二区三区| 精品久久少妇激情视频| 日韩亚洲精品国产第二页| 国产又粗又猛又爽又黄的文字| 国产一区一一一区麻豆| 好吊日成人免费视频公开| 日本不卡在线一区二区三区| 五月激情五月天综合网| 超碰在线播放国产精品| 久久大香蕉一区二区三区| 中文字幕一区二区久久综合| 国产又粗又猛又长又黄视频| 超碰在线免费公开中国黄片| 国内精品一区二区欧美| 欧美三级不卡在线观线看| 午夜直播免费福利平台| 国产又猛又黄又粗又爽无遮挡| 伊人久久青草地婷婷综合| 日韩丝袜诱惑一区二区| 老鸭窝老鸭窝一区二区| 日本人妻丰满熟妇久久| 国产精品国产亚洲区久久| 加勒比日本欧美在线观看| 黑丝袜美女老师的小逼逼| 国产原创中文av在线播放| 国产一区欧美午夜福利| 欧美日韩最近中国黄片| 国产日韩欧美在线播放| 国产精品免费自拍视频| 欧美成人免费一级特黄| 国产三级不卡在线观看视频| 精品国产91亚洲一区二区三区| 亚洲一区二区三区三州| 亚洲淫片一区二区三区| 少妇熟女精品一区二区三区| 黑丝国产精品一区二区|