python日志模塊logging案例詳解
日志模塊主要用于輸出運(yùn)行日志,可以設(shè)置輸出日志的等級、日志保存路徑、日志文件回滾等
一、優(yōu)勢
可以通過設(shè)置不同的日志等級,在release版本中只輸出重要信息,而不必顯示大量的調(diào)試信息;
print將所有信息都輸出到標(biāo)準(zhǔn)輸出中,嚴(yán)重影響開發(fā)者從標(biāo)準(zhǔn)輸出中查看其它數(shù)據(jù);logging則可以由開發(fā)者決定將信息輸出到什么地方,以及怎么輸出。
二、等級(level)
開發(fā)應(yīng)用程序或部署開發(fā)環(huán)境時,可以使用DEBUG或INFO級別的日志獲取盡可能詳細(xì)的日志信息來進(jìn)行開發(fā)或部署調(diào)試
應(yīng)用上線或部署生產(chǎn)環(huán)境時,應(yīng)該使用WARNING或ERROR或CRITICAL級別的日志來降低機(jī)器的I/O壓力和提高獲取錯誤日志信息的效率。日志級別的指定通常都是在應(yīng)用程序的配置文件中進(jìn)行指定的。
分級
日志等級:DEBUG < INFO < WARNING < ERROR <CRITICAL
- DEBUG 最詳細(xì)的日志信息,典型應(yīng)用場景是 問題診斷
- INFO 信息詳細(xì)程度僅次于DEBUG,通常只記錄關(guān)鍵節(jié)點(diǎn)信息,用于確認(rèn)一切都是按照我們預(yù)期的那樣進(jìn)行工作
- WARNING 當(dāng)某些不期望的事情發(fā)生時記錄的信息(如,磁盤可用空間較低),但是此時應(yīng)用程序還是正常運(yùn)行的
- ERROR 由于一個更嚴(yán)重的問題導(dǎo)致某些功能不能正常運(yùn)行時記錄的信息
- CRITICAL 當(dāng)發(fā)生嚴(yán)重錯誤,導(dǎo)致應(yīng)用程序不能繼續(xù)運(yùn)行時記錄的信息
三、使用方式
1.使用logging提供的模塊級別的函數(shù)
創(chuàng)建一條日志記錄
- 創(chuàng)建一條嚴(yán)重級別為DEBUG的日志記錄 logging.debug(msg, *args, **kwargs)
- 創(chuàng)建一條嚴(yán)重級別為INFO的日志記錄 logging.info(msg, *args, **kwargs)
- 創(chuàng)建一條嚴(yán)重級別為WARNING 的日志記錄 logging.warning(msg, *args, **kwargs)
- 創(chuàng)建一條嚴(yán)重級別為ERROR的日志記錄 logging.error(msg, *args, **kwargs)
- 創(chuàng)建一條嚴(yán)重級別為CRITICAL的日志記錄 logging.critical(msg, *args, **kwargs)
- 創(chuàng)建一條嚴(yán)重級別為level的日志記錄 logging.log(level, *args, **kwargs)
例:
import logging
logging.debug("debug_msg")
logging.info("info_msg")
logging.warning("warning_msg")
logging.error("error_msg")
logging.critical("critical_msg") 默認(rèn)情況下logging模塊將日志打印到只顯示了大于等于WARNING級別的日志,這說明默認(rèn)的日志級別設(shè)置為WARNING(日志級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG)
默認(rèn)的日志格式為日志級別:Logger名稱:用戶輸出消息
2.對root logger進(jìn)行一次性配置
logging.basicConfig(**kwargs)
logging.basicConfig(**kwargs)函數(shù) 用于指定“要記錄的日志級別”、“日志格式”、“日志輸出位置”、“日志文件的打開模式”等信息,其他幾個都是用于記錄各個級別日志的函數(shù)。
用默認(rèn)日志格式(Formatter)為日志系統(tǒng)建立一個默認(rèn)的流處理器(StreamHandler),設(shè)置基礎(chǔ)配置(如日志級別等)并加到root logger(根Logger)中)
logging.basicConfig()函數(shù)參數(shù)說明
- filename 指定日志輸出目標(biāo)文件的文件名(可以寫文件名也可以寫文件的完整的絕對路徑,寫文件名日志放執(zhí)行文件目錄下,寫完整路徑按照完整路徑生成日志文件),指定該設(shè)置項(xiàng)后日志信心就不會被輸出到控制臺了
- filemode 指定日志文件的打開模式,默認(rèn)為’a’。需要注意的是,該選項(xiàng)要在filename指定時才有效
- format 指定日志格式字符串,即指定日志輸出時所包含的字段信息以及它們的順序。logging模塊定義的格式字段下面會列出。
- datefmt 指定日期/時間格式。需要注意的是,該選項(xiàng)要在format中包含時間字段%(asctime)s時才有效
- level 指定日志器的日志級別
- stream 指定日志輸出目標(biāo)stream,如sys.stdout、sys.stderr以及網(wǎng)絡(luò)stream。需要說明的是,stream和filename不能同時提供,否則會引發(fā) ValueError異常
- style Python 3.2中新添加的配置項(xiàng)。指定format格式字符串的風(fēng)格,可取值為’%‘、’{‘和’$‘,默認(rèn)為’%’
- handlers Python3.3中新添加的配置項(xiàng)。該選項(xiàng)如果被指定,它應(yīng)該是一個創(chuàng)建了多個Handler的可迭代對象,這些handler將會被添加到root logger。需要說明的是:filename、stream和handlers這三個配置項(xiàng)只能有一個存在,不能同時出現(xiàn)2個或3個,否則會引發(fā)ValueError異常。
例
import logging
logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(name)s %(levelname)s %(message)s",
datefmt = '%Y-%m-%d %H:%M:%S %a'
) #注意月份和天數(shù)不要搞亂了,這里的格式化符與time模塊相同
logging.debug("msg1")
logging.info("msg2")
logging.warning("msg3")
logging.error("msg4")
logging.critical("msg5")
結(jié)果:
2023-03-01 23:37:49 Wed root DEBUG msg1
2023-03-01 23:37:49 Wed root INFO msg2
2023-03-01 23:37:49 Wed root WARNING msg3
2023-03-01 23:37:49 Wed root ERROR msg4
2023-03-01 23:37:49 Wed root CRITICAL msg5 四、日志流處理流程(使用Logging日志系統(tǒng)的四大組件)
日志器(logger)是入口,真正干活兒的是處理器(handler),處理器(handler)還可以通過過濾器(filter)和格式器(formatter)對要輸出的日志內(nèi)容做過濾和格式化等處理操作。
1.日志器-Logger
提供了應(yīng)用程序可一直使用的接口
功能
1)向應(yīng)用程序代碼暴露幾個方法,使應(yīng)用程序可以在運(yùn)行時記錄日志消息;
2)基于日志嚴(yán)重等級(默認(rèn)的過濾設(shè)施)或filter對象來決定要對哪些日志進(jìn)行后續(xù)處理;
3)將日志消息傳送給所有感興趣的日志handlers。
Logger對象最常用的方法分為兩類:配置方法 和 消息發(fā)送方法
配置方法
Logger.setLevel() 設(shè)置日志器將會處理的日志消息的最低嚴(yán)重級別
Logger.addHandler() 和 Logger.removeHandler() 為該logger對象添加 和 移除一個handler對象
Logger.addFilter() 和 Logger.removeFilter() 為該logger對象添加 和 移除一個filter對象
創(chuàng)建日志記錄
創(chuàng)建一個與它們的方法名對應(yīng)等級的日志記錄
Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), Logger.critical()
創(chuàng)建一個類似于Logger.error()的日志消息
Logger.exception()
需要獲取一個明確的日志level參數(shù)來創(chuàng)建一個日志記錄
Logger.log()
2.處理器 -Handler
將logger創(chuàng)建的日志記錄分發(fā)到handler指定的位置(文件、網(wǎng)絡(luò)、郵件等)。
子類
- logging.StreamHandler 將日志消息發(fā)送到輸出到Stream,如std.out, std.err或任何file-like對象。
- logging.FileHandler 將日志消息發(fā)送到磁盤文件,默認(rèn)情況下文件大小會無限增長
- logging.handlers.RotatingFileHandler 將日志消息發(fā)送到磁盤文件,并支持日志文件按大小切割
- logging.hanlders.TimedRotatingFileHandler 將日志消息發(fā)送到磁盤文件,并支持日志文件按時間切割
- logging.handlers.HTTPHandler 將日志消息以GET或POST的方式發(fā)送給一個HTTP服務(wù)器
- logging.handlers.SMTPHandler 將日志消息發(fā)送給一個指定的email地址
- logging.NullHandler 該Handler實(shí)例會忽略error messages,通常被想使用logging的library開發(fā)者使用來避免’No handlers could be found for logger XXX’信息的出現(xiàn)。
說明
Handler.setLevel(lel):指定被處理的信息級別,低于lel級別的信息將被忽略
Handler.setFormatter():給這個handler選擇一個格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter對象
3.過濾器 -Filter
提供了更細(xì)粒度的控制工具來決定輸出哪條日志記錄,丟棄哪條日志記錄
Filter是一個過濾器基類,它只允許某個logger層級下的日志事件通過過濾
定義
class logging.Filter(name=‘’)
filter(record)
4.格式器 Formatter
配置日志信息的最終順序、結(jié)構(gòu)和內(nèi)容。
Formatter類的構(gòu)造方法
logging.Formatter.__init__(fmt=None, datefmt=None, style='%')
參數(shù)
fmt:指定消息格式化字符串,如果不指定該參數(shù)則默認(rèn)使用message的原始值
datefmt:指定日期格式字符串,如果不指定該參數(shù)則默認(rèn)使用"%Y-%m-%d %H:%M:%S"
style:Python 3.2新增的參數(shù),可取值為 '%', '{'和 '$',如果不指定該參數(shù)則默認(rèn)使用'%'5.日志流處理簡要流
- 1、創(chuàng)建一個logger
- 2、設(shè)置下logger的日志的等級
- 3、創(chuàng)建合適的Handler(FileHandler要有路徑)
- 4、設(shè)置下每個Handler的日志等級
- 5、創(chuàng)建下日志的格式
- 6、向Handler中添加上面創(chuàng)建的格式
- 7、將上面創(chuàng)建的Handler添加到logger中
- 8、打印輸出logger.debug\logger.info\logger.warning\logger.error\logger.critical
6.實(shí)例
import logging
# 創(chuàng)建日志器對象
logger = logging.getLogger(__name__)
# 設(shè)置logger可輸出日志級別范圍
logger.setLevel(logging.DEBUG)
# 添加控制臺handler,用于輸出日志到控制臺
console_handler = logging.StreamHandler()
# 添加日志文件handler,用于輸出日志到文件中
file_handler = logging.FileHandler(filename='log.log', encoding='UTF-8')
# 將handler添加到日志器中
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 設(shè)置格式并賦予handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 輸出不同級別日志
logger.debug("============【開始測試】====================")
logger.info("============【開始測試】====================")
logger.warning("============【開始測試】====================")
logger.critical("============【開始測試】====================")
logger.error("============【開始測試】====================")
結(jié)果為:
2023-03-18 02:32:46,316 - __main__ - DEBUG - ============【開始測試】====================
2023-03-18 02:32:46,316 - __main__ - INFO - ============【開始測試】====================
2023-03-18 02:32:46,316 - __main__ - WARNING - ============【開始測試】====================
2023-03-18 02:32:46,316 - __main__ - CRITICAL - ============【開始測試】====================
2023-03-18 02:32:46,316 - __main__ - ERROR - ============【開始測試】====================到此這篇關(guān)于python日志模塊logging的文章就介紹到這了,更多相關(guān)python日志模塊logging內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中使用PIL庫實(shí)現(xiàn)圖片高斯模糊實(shí)例
這篇文章主要介紹了Python中使用PIL庫實(shí)現(xiàn)圖片高斯模糊實(shí)例,本文重點(diǎn)在修改了Pil的源碼實(shí)現(xiàn)可以自定義模糊度,需要的朋友可以參考下2015-02-02
Python編程中Python與GIL互斥鎖關(guān)系作用分析
GIL互斥鎖用來保護(hù)Python世界里的對象,防止同一時刻多個線程執(zhí)行Python字節(jié)碼,確保線程安全,但也導(dǎo)致Python線程無法利用多核CPU優(yōu)勢,本文來探討Python將來是否有可能去除GIL2021-09-09
Matplotlib實(shí)戰(zhàn)之面積圖繪制詳解
面積圖,或稱區(qū)域圖,是一種隨有序變量的變化,反映數(shù)值變化的統(tǒng)計(jì)圖表,這篇文章主要介紹了如何利用Matplotlib實(shí)現(xiàn)面積圖的繪制,需要的可以參考下2023-08-08
Python中使用partial改變方法默認(rèn)參數(shù)實(shí)例
這篇文章主要介紹了Python中使用partial改變方法默認(rèn)參數(shù)實(shí)例,本文直接給出使用實(shí)例,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-04-04
Python文件操作與數(shù)據(jù)處理實(shí)戰(zhàn)指南
文件操作與數(shù)據(jù)處理是Python編程中最基礎(chǔ)也是最重要的技能之一,無論是數(shù)據(jù)分析、Web開發(fā)還是自動化腳本編寫,都離不開對文件的讀寫和各種數(shù)據(jù)處理操作,本文將全面介紹Python中的文件操作方法和常用數(shù)據(jù)處理技巧,需要的朋友可以參考下2025-04-04

