Python logging 模塊
例子
-
代碼
Paste_Image.png -
輸出結(jié)果
Paste_Image.png
詳解
- logging.basicConfig()函數(shù)中可通過(guò)具體參數(shù)來(lái)更改logging模塊默認(rèn)行為,可用參數(shù)
- filename:用于指定文件名創(chuàng)建FileHandler,存儲(chǔ)日志到指定文件中。
- filemode:文件打開(kāi)方式,在指定了filename時(shí)使用這個(gè)參數(shù),默認(rèn)值為"a"(只讀),還可指定為"w"(只寫)。
- format:指定handler使用的日志顯示格式。
- datefmt:指定日期時(shí)間格式。
- level:設(shè)置rootlog的日志級(jí)別。
- stream:用指定的stream創(chuàng)建StreamHandler??梢灾付ㄝ敵龅絪ys.stderr,sys.stdout或者文件,默認(rèn)為sys.stderr。若同時(shí)列出了fliename和stream兩個(gè)參數(shù),則stream參數(shù)會(huì)被忽略。
format 參數(shù)中可能用到的格式化串:
- %(name)s Logger的名字
- %(levelno)s 數(shù)字形式的日志
- %(levelname)s 文本形式的日志
- %(pathname)s 調(diào)用日志輸出函數(shù)的模塊的完整路徑名,可能沒(méi)有
- %(filename)s 調(diào)用日志輸出函數(shù)的模塊的文件名
- %(module)s 調(diào)用日志輸出函數(shù)的模塊名
- %(funcName)s 調(diào)用日志輸出函數(shù)的函數(shù)名
- %(lineno)d 調(diào)用日志輸出函數(shù)的語(yǔ)句所在的代碼行
- %(created)f 當(dāng)前時(shí)間,用UNIX標(biāo)準(zhǔn)的表示時(shí)間的浮點(diǎn)數(shù)表示
- %(relativeCreated)d 輸出日志信息時(shí)的,自logger創(chuàng)建以來(lái)的毫秒數(shù)。
- %(asctime)s 字符串形式的當(dāng)前時(shí)間。默認(rèn)格式"2016-07-19 16:06:46,292"
- %(thread)d 線程名??赡軟](méi)有
- %(process)d 進(jìn)程ID??赡軟](méi)有
- %(message)s 用戶輸出的信息。
logging
- logging 庫(kù)提供了多個(gè)組件:Logger、Handler、Filter、Formatter。Logger對(duì)象提供應(yīng)用程序可直接使用的接口,Handler發(fā)生日志到適當(dāng)?shù)哪康牡?,F(xiàn)ilter提供了過(guò)濾日志信息的方法,F(xiàn)ormatter指定日志顯示格式。
Logger
Logger 是一個(gè)樹(shù)形層級(jí)結(jié)構(gòu),輸出信息之前都要獲得一個(gè)Logger(如果沒(méi)有顯示的獲取則自動(dòng)創(chuàng)建并使用root Logger)。logger=logging.getLogger()返回一個(gè)默認(rèn)的Logger也即root Logger,并應(yīng)用默認(rèn)日志級(jí)別、Handler和Formatter設(shè)置。當(dāng)然也可以通過(guò)Logger.setLevel(lel)指定最低的日志級(jí)別,可用的日志級(jí)別有l(wèi)ogging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL。
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()輸出不同級(jí)別的日志,只有日志等級(jí)大于或等于設(shè)置的日志級(jí)別的日志才會(huì)被輸出。
-
創(chuàng)建一個(gè)logger
日志級(jí)別等級(jí)
- 默認(rèn)的日志級(jí)別設(shè)置為WARNING,日志級(jí)別等級(jí)CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
Handler
- 定義Handler
fh = logging.FileHandler('test.log')
ch = logging.StreamHandler() - Handler 對(duì)象負(fù)責(zé)發(fā)送相關(guān)信息到指定目的地,有幾個(gè)常用的Handler方法:
Handler.setLevel(lev):指定日志級(jí)別,低于級(jí)別的日志將被忽略
Handler.setFormatter():給這個(gè)handler選擇一個(gè)Formatter
Handler.addFilter(filt):新增一個(gè)filter對(duì)象
Handler.removeFilter(filt):刪除一個(gè)filter對(duì)象 - 為 Logger 添加多個(gè)Handler:
logger.addHandler(fh)
logger.addHandler(ch) - 有多種可用的Handler:
logging.StreamHandler 可以向類似與sys.stdout或者sys.stderr的任何文件對(duì)象(file object)輸出信息
logging.FileHandler 用于向一個(gè)文件輸出日志信息logging.handlers.RotatingFileHandler 類似于上面的FileHandler,但是它可以管理文件大小。當(dāng)文件達(dá)到一定大小之后,它會(huì)自動(dòng)將當(dāng)前日志文件改名,然后創(chuàng)建一個(gè)新的同名日志文件繼續(xù)輸出logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler類似,不過(guò),它沒(méi)有通過(guò)判斷文件大小來(lái)決定何時(shí)重新創(chuàng)建日志文件,而是間隔一定時(shí)間就自動(dòng)創(chuàng)建新的日志文件
logging.handlers.SocketHandler 使用TCP協(xié)議,將日志信息發(fā)送到網(wǎng)絡(luò)。
logging.handlers.DatagramHandler 使用UDP協(xié)議,將日志信息發(fā)送到網(wǎng)絡(luò)。
logging.handlers.SysLogHandler 日志輸出到sysloglogging.handlers.NTEventLogHandler 遠(yuǎn)程輸出日志到Windows NT/2000/XP的事件日志
logging.handlers.SMTPHandler 遠(yuǎn)程輸出日志到郵件地址logging.handlers.MemoryHandler 日志輸出到內(nèi)存中的制定bufferlogging.handlers.HTTPHandler 通過(guò)"GET"或"POST"遠(yuǎn)程輸出到HTTP服務(wù)器
https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers
Formatter
- Formatter 對(duì)象設(shè)置日志信息最后的規(guī)則、結(jié)構(gòu)、和內(nèi)容,默認(rèn)時(shí)間格式為 %Y-%m-%d %H:%M:%S
- 定義 Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levename)s - %(message)s') - 為Handler添加Formatter
fh.setFormatter(formatter)
ch.setFormatter(formatter)
Filter
- 限制只有滿足過(guò)濾規(guī)則的日志才會(huì)輸出
- 比如我們定義了filter = logging.Filter('a.b.c'),并將這個(gè)Filter添加到了一個(gè)Handler上,則使用該Handler的Logger中只有名字帶a.b.c前綴的Logger才能輸出其日志
filter = logging.Filter('mylogger.child1.child2')
fh.addFilter(filter) - 若為Handler添加Filter則所有使用了該Handler的logger都會(huì)受到影響。而為L(zhǎng)ogger添加Filer只會(huì)影響到自身。、


