概述
Python logging 模塊定義了為應用程序和庫實現(xiàn)靈活的事件日志記錄的函數(shù)和類,可以方便第三方模塊或者是應用使用。這個模塊提供不同的日志級別,并可以采用不同的方式記錄日志,比如文件,HTTP GET/POST,SMTP,Socket 等,甚至可以自定義實現(xiàn)具體的日志記錄方式。
Logging 優(yōu)點:
- 使用 Python Logging 模塊的主要好處是所有 Python 模塊都可以參與日志記錄
- Logging 模塊提供了大量具有靈活性的功能
- 可以控制消息的級別,過濾掉那些并不重要的消息。
日志級別等級排序:critical > error > warning > info > debug
級別越高打印的日志越少,反之亦然。默認情況下日志打印只顯示大于等于 WARNING 級別的日志。
日志記錄的兩種方式
Logging 模塊提供了兩種日志記錄方式:
- 方式1:使用 Logging 提供的模塊級別的函數(shù)
- 方式2:使用 Logging 日志系統(tǒng)的四大組件記錄
logging 模塊常用 API
-
debug(msg: str)、info(msg: str)、warning(msg: str)、error(msg: str) :生成不同級別的日志
-
basicConfig(
**kwargs
) :配置全局的日志系統(tǒng)參數(shù),通常在應用程序的入口處調(diào)用??梢杂糜谠O置日志級別、輸出格式、輸出位置等參數(shù)。它接受一系列關鍵字參數(shù)(
kwargs
),以設置日志記錄的行為。以下是一些常用參數(shù):-
level :指定日志記錄的最低級別。只有比該級別高或相同級別的消息才會被記錄。
可選級別包括 logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR 和 logging.CRITICAL
-
filename :指定日志輸出的文件名。如果指定了此參數(shù),日志將寫入文件而不是默認的標準輸出。
-
filemode :指定日志文件的打開模式,默認為 ‘a(chǎn)’(追加模式)。
可以將其設置為 ‘w’(覆蓋模式)或其他文件打開模式。
-
format :指定日志消息的輸出格式。可以使用格式化字符串來定義輸出的內(nèi)容和樣式
-
datefmt :指定日期和時間的格式。
如果 format 中包含
%asctime%
,則可以使用此參數(shù)自定義日期和時間的顯示方式。 -
style :指定格式字符串的風格,可選值為 ‘%’ 和 ‘{’
默認為 ‘%’,表示使用傳統(tǒng)的 % 格式化風格??梢赃x擇 ‘{’ 風格來使用更現(xiàn)代的 {} 格式。
-
handlers :指定用于處理日志消息的處理程序列表。
可以將處理器直接傳遞給 handlers 參數(shù),而不是使用 logger 的 addHandler() 方法添加
注意:該參數(shù)會直接覆蓋默認的標準輸出處理器
-
-
getLogger(name: str) :用于創(chuàng)建和配置日志記錄器(logger)。日志記錄器用于在應用程序中生成日志消息,以便跟蹤應用程序的運行和診斷問題。
通常,可以為每個模塊或子系統(tǒng)創(chuàng)建一個不同的記錄器,以便更好地組織和管理日志消息。
該方法通常接受一個名稱參數(shù),該參數(shù)用于指定要創(chuàng)建或獲取的日志記錄器的名稱。logger 是單例的,如果多個模塊使用相同的名稱調(diào)用
getLogger
,它們將獲取到相同的記錄器實例,從而實現(xiàn)日志消息的集中記錄。 -
FileHandler(filename: str) :獲取一個文件處理器(logging 模塊提供的處理器 handler 之一),用于配置將日志消息寫入指定的文件中,并根據(jù)需要配置級別和格式。
-
StreamHandler() :獲取一個標準輸出流處理器(logging 模塊提供的處理器 handler 之一),用于配置將日志消息輸出到標準輸出流,通常是終端窗口或命令行界面,并根據(jù)需要配置級別和格式。
-
Formatter(format: str) : 獲取 logging 模塊提供的用于定義和格式化日志消息的輸出格式的類對象。
通過使用 Formatter,可以自定義日志消息的顯示方式,包括日期時間、記錄器名稱、日志級別和消息內(nèi)容等。
常用自定義日志輸出格式:
'%(asctime)s [%(levelname)s] [%(threadName)s] [%(module)s.%(funcName)s.%(lineno)d] : %(message)s'
日期和時間的格式:
'%Y-%m-%d %H:%M:%S'
logging 的四大組件
簡介
logging 模塊采用了模塊化設計,主要包含四種組件:
- loggers:記錄器,提供應用程序代碼能直接使用的接口
- handlers:處理器,將記錄器產(chǎn)生的日志發(fā)送至目的地
- filters:過濾器,提供更好的粒度控制,決定哪些日志會被輸出
- formatters:格式化器,設置日志內(nèi)容的組成結(jié)構和消息字段
組件之間的關聯(lián)關系
-
記錄器(logger)需要通過處理器(handler)將日志信息輸出到目標位置,不同的處理器(handler)可以將日志輸出到不同的位置;
記錄器(logger)可以設置多個處理器(handler)將同一條日志記錄輸出到不同的位置;
每個處理器(handler)都可以設置自己的過濾器(filter)實現(xiàn)日志過濾,從而只保留感興趣的日志;
每個處理器(handler)都可以設置自己的格式器(formatter)實現(xiàn)同一條日志以不同的格式輸出到不同的地方。
-
簡單來說:日志器(logger)是入口,真正干活兒的是處理器(handler),處理器(handler)還可以通過過濾器(filter)和格式器(formatter)對要輸出的日志內(nèi)容做過濾和格式化等處理操作。
-
一個記錄器(logger)可以包含一個或多個處理器(handler)和 過濾器(filter)
一個處理器(handler)可以新增一個或多個格式器(formatter)和過濾器(filter),而且日志級別將會繼承。
logger:記錄器
常用方法:
-
debug(msg)、info(msg)、warning(msg)、error(msg) :生成不同級別的日志
-
setLevel() :設置記錄器的日志級別,以確定哪些級別的日志消息會被記錄。
注:
-
默認日志級別為 WARNING
-
除了設置日志記錄器的級別,還需要確保與該記錄器關聯(lián)的處理器的日志級別設置一致。
如果處理器的級別高于記錄器的級別,那么即使記錄器級別足夠低,也不會記錄消息。
-
-
addFilter(filter) :添加一個過濾器,用于對日志消息進行額外的篩選和處理。
-
addHandler(handler) :添加一個日志處理器,指定如何處理日志消息,例如寫入文件、打印到控制臺等
-
removeFilter(filter) :從日志記錄器中移除指定的過濾器。
-
removeHandler(handler) :從 logger 中移除指定的處理程序
handler:處理器
在 Python 的 logging 模塊中,handlers(處理器)負責定義日志記錄應輸出到何處。處理器確定日志記錄如何處理,無論是將它們發(fā)送到控制臺、寫入文件,還是甚至通過網(wǎng)絡發(fā)送。
以下是 logging 模塊提供的一些常見日志處理器:
-
logging.StreamHandler :此處理程序?qū)⑷罩居涗洶l(fā)送到一個流(stream),通常是控制臺(stdout 或 stderr)。適用于在終端中顯示日志消息。
-
logging.FileHandler :此處理程序?qū)⑷罩居涗泴懭胫付ǖ娜罩疚募?/p>
常用參數(shù):
-
filename(必傳):指定日志文件的基本名稱
-
mode :指定打開文件的模式,默認為 ‘a(chǎn)’(追加模式)
可以選擇的模式包括:
- ‘a(chǎn)’:追加模式,在文件末尾追加日志消息
- ‘w’:寫模式,每次寫入日志消息時都會覆蓋文件
-
-
logging.handlers.RotatingFileHandler :此處理程序允許在日志文件達到一定大小時進行“滾動”,創(chuàng)建一個新的日志文件??梢灾付ㄗ畲蟮娜罩疚募笮?,一旦達到該大小,就會創(chuàng)建一個新的日志文件。
常用參數(shù):
-
filename(必傳):指定日志文件的名稱
輪換后的日志文件會以這個名稱作為前綴,數(shù)字索引會被附加到名稱中以創(chuàng)建不同的日志文件。
例如,如果設置為 ‘my_log.log’,則生成的文件將類似于 ‘my_log.log’、‘my_log.log.1’、‘my_log.log.2’,以此類推。
-
mode :指定打開文件的模式,默認為 ‘a(chǎn)’(追加模式)
-
maxBytes :指定單個日志文件的最大字節(jié)數(shù)。一旦達到這個大小,會觸發(fā)輪換并創(chuàng)建新的日志文件。
默認值為 0,表示不限制日志文件的大小。
-
backupCount :指定要保留的舊日志文件的最大數(shù)量。一旦超過這個數(shù)量,最早的日志文件將被刪除。
默認值為 0,表示不保留舊日志文件。
-
encoding :指定日志文件的編碼方式,默認為 None,表示使用系統(tǒng)默認編碼。
-
-
logging.handlers.TimedRotatingFileHandler :此處理程序根據(jù)指定的時間間隔(如每天、每小時等)對日志文件進行輪換,可以根據(jù)時間來組織日志文件。
常用參數(shù):
-
filename(必傳):指定日志文件的基本名稱。輪換后的日志文件會以這個名稱作為前綴,日期和時間戳會被附加到名稱中以創(chuàng)建不同的日志文件
-
when :指定輪換的時間間隔。默認值為 H
可選值包括:‘S’:秒,‘M’:分鐘,‘H’:小時,‘D’:天,‘W0’ - ‘W6’:每周的某一天,其中 ‘W0’ 表示周日,‘W6’ 表示周六,‘midnight’:每天午夜。
-
interval :指定輪換的時間間隔大小。默認值為 1,表示每個 when 指定的時間單位都會觸發(fā)一次輪換。
-
backupCount :指定在輪換期間要保留的舊日志文件的最大數(shù)量。一旦超過這個數(shù)量,最早的日志文件將被刪除。
默認值為 0,表示不保留舊日志文件。
-
encoding :指定日志文件的編碼方式,默認為 None,表示使用系統(tǒng)默認編碼。
-
atTime :可選參數(shù),用于指定輪換的準確時間。
當 when 設置為 ‘S’、‘M’、‘H’ 時,可以使用此參數(shù)來指定具體的時間,例如 'atTime=‘23:30:00’
-
-
logging.handlers.SocketHandler :將日志消息發(fā)送到網(wǎng)絡套接字,可以用于將日志信息發(fā)送到遠程服務器。
-
logging.handlers.SysLogHandler :將日志消息發(fā)送到系統(tǒng)日志,通常用于在 Unix 系統(tǒng)上記錄系統(tǒng)事件。
-
logging.handlers.NTEventLogHandler :將日志消息發(fā)送到 Windows 事件日志,通常用于在 Windows 系統(tǒng)上記錄事件。
handlers 處理器的一些常用的通用方法:
- setLevel() :設置記錄器的日志級別。只有達到或超過這個級別的日志消息才會被處理器處理。
- setFormatter(fmt: Formatter) :設置處理器的日志消息格式化器
- **addFilter(filter) ** :添加一個過濾器(filter)到處理器。過濾器用于更細粒度地控制哪些日志消息會被處理。
- removeFilter(filter) :從處理器中移除指定的過濾器。
filter:過濾器
在 Python 的 logging 模塊中,F(xiàn)ilter 類用于過濾日志消息,允許更細粒度地控制哪些日志消息會被處理器處理。
可以自定義一個或多個過濾器,并將它們添加到處理器或記錄器中,以僅允許滿足特定條件的日志消息被記錄或處理。
一些常見的內(nèi)置過濾器:
-
logging.Filter:一個通用的基類過濾器,可以繼承它并實現(xiàn)自定義的 filter(record) 方法來控制哪些日志消息會被處理。
這是一個靈活的過濾器,可以用于滿足各種不同的需求。
# 自定義過濾器 class MyFilter(logging.Filter): def filter(self, record): # 只有級別為 WARNING 及以上的日志消息才會被記錄 return record.levelno >= logging.WARNING # 創(chuàng)建一個自定義過濾器并添加到處理器 my_filter = MyFilter() handler.addFilter(my_filter)
-
logging.FilterByLevel(level):根據(jù)日志級別篩選日志消息的過濾器。
可以指定最低的日志級別,只有達到或超過該級別的日志消息才會被處理。
例如,如果要僅記錄級別為 WARNING 及以上的日志消息,可以使用如下方式:
filter = logging.FilterByLevel(logging.WARNING)
-
logging.FilterByName(name):根據(jù)記錄器名稱篩選日志消息的過濾器。
可以使用此過濾器指定特定記錄器的日志消息是否應該被處理。
例如,如果要僅記錄名為 “my_logger” 的記錄器的日志消息,可以使用如下方式:
filter = logging.FilterByName('my_logger')
-
logging.FilterByValue(key, value):根據(jù)日志記錄中的屬性鍵和值來篩選日志消息。
只有具有指定鍵和值的屬性的日志消息才會被處理。
formatter:格式化器
在 Python 的 logging 模塊中,F(xiàn)ormatter 類用于定義日志消息的輸出格式。
通過使用格式化器,可以自定義日志消息的外觀,以包括時間戳、日志級別、日志名稱、消息文本等信息。
以下是一些常見的格式化占位符,可以用于創(chuàng)建自定義格式化器:
-
%(asctime)s :字符串形式的當前時間。默認格式是 “%Y-%m-%d %H:%M:%S,sss”,其中
%Y
表示年份、%m
表示月份、%d
表示日期、%H
表示小時、%M
表示分鐘、%S
表示秒鐘、sss
表示毫秒 -
%(levelname)s :文本形式的日志級別
-
%(levelno)s :數(shù)字形式的日志級別
-
%(message)s :用戶輸出的消息
注:顯式指定毫秒會報錯,原因未知。若需要打印毫秒級的時間,使用默認即可,不要顯式指定時間格式
-
%(name)s :Logger(記錄器)的名字
-
%(pathname)s :調(diào)用日志輸出函數(shù)的模塊的完整路徑名,可能沒有
-
%(filename)s :調(diào)用日志輸出函數(shù)的模塊的文件名
-
%(module)s :調(diào)用日志輸出函數(shù)的模塊名
-
%(funcName)s :調(diào)用日志輸出函數(shù)的函數(shù)名
-
%(lineno)d :調(diào)用日志輸出函數(shù)的語句所在的代碼行
-
%(created)f :當前時間,用 UNIX 標準的表示時間的浮點數(shù)表示,通常是從 Epoch 時間(1970年1月1日起的秒數(shù))
-
%(relativeCreated)d :輸出日志信息時的,自 Logger 創(chuàng)建以來的毫秒數(shù)
-
%(thread)d :線程 ID??赡軟]有
-
%(threadName)s :線程名。可能沒有文章來源:http://www.zghlxwxcb.cn/news/detail-753306.html
-
%(process)d :進程 ID??赡軟]有文章來源地址http://www.zghlxwxcb.cn/news/detail-753306.html
代碼示例
import logging
import socket
import os
log_format = '%(asctime)s [%(levelname)s] [%(threadName)s] [%(module)s.%(funcName)s.%(lineno)d] : %(message)s'
# 配置全局的日志系統(tǒng)參數(shù)
logging.basicConfig(level='DEBUG', format=log_format)
file_dir = './log'
if not os.path.exists(file_dir):
os.makedirs(file_dir)
# 使用主機名作為日志文件名稱
file_name = os.path.join(file_dir, socket.gethostname() + ".log")
# 創(chuàng)建一個處理器,將日志寫入文件
file_handler = logging.FileHandler(os.path.join(file_name))
file_handler.setFormatter(logging.Formatter(log_format))
# 將日志文件處理器加入到默認記錄器中
logging.getLogger().addHandler(file_handler)
name = "ZhangSan"
logging.debug(f"my name is {name}")
到了這里,關于python 常用內(nèi)置模塊之 logging(日志輸出)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!