描述
環(huán)境: python3.x
源碼: /Lib/logging/init.py
python提供了logging模塊乾忱,用于記錄程序運行過程中的一些關鍵信息掀虎,以便于對程序的運行狀況進行跟蹤辜荠。
logging模塊簡單易用且功能強大。該模塊支持將日志信息保存在不同的地方,如:日志文件叽躯、Windows事件再扭、郵件氧苍、http請求等。由于logging模塊內容較多泛范,無法詳細記錄让虐,更多內容請查看官方文檔
模塊介紹
Logging.Logger
用于記錄日志
logger類不直接實例化,但是需要通過函數(shù)logging.getLogger(name)
獲取罢荡。相同的name將會返回相同Logger實例的引用赡突。
name是一個點分字符串,如
foo
foo.bar
foo.bam
foo.bar.baz
...
foo.bar
foo.bam
foo.bar.baz
都是foo
后裔
同理foo.bar.baz
是foo.bar
的后裔
如果直接使用logging.debug()
等方法区赵,則默認使用name為root的logger惭缰。
配置
Logger.propagate
指定了日志的傳播性。當值為true
時笼才,日志將會傳播給祖先logger漱受。當值為false
時,日志將不向上傳播骡送。
Logger.setLevel(lvl)
指定了日志的等級昂羡,等級值小于lvl
的日志將會被忽略。給handler設置日志等級也可以實現(xiàn)該效果摔踱。
等級 | 值 |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
Logger.getChild(suffix)
獲取子日志實例虐先,``logging.getLogger('abc').getChild('def.ghi')相同于
logging.getLogger('abc.def.ghi')`
Logger.addHandler(hdlr)
和 Logger.removeHandler(hdlr)
為logger增刪Handler。
Logger.addFilter(filt)
和 Logger.removeFilter(filt)
為logger增刪Filter派敷。
日志方法
基本用法
Logger.debug(msg, *args, **kwargs)
Logger.info(msg, *args, **kwargs)
Logger.warning(msg, *args, **kwargs)
Logger.error(msg, *args, **kwargs)
Logger.critical(msg, *args, **kwargs)
Logger.log(lvl, msg, *args, **kwargs)
Logger.exception(msg, *args, **kwargs)
# example
logging.basicConfig(level=logging.DEBUG)
logging.debug('log debug')
logging.info('log info')
logging.warning('log warning')
logging.error('log error')
logging.critical('log critical')
logging.shutdown() # 應該在應用程序退出時調用
復雜用法
logging.basicConfig(format='[%(asctime)s] %(message)s, %(user)s => %(pwd)s', datefmt='%Y-%m-%d %H:%M:%S')
extra = {'user': 'admin', 'pwd': '123456'}
logging.warning('login failed: %s', 'wrong password', extra=extra)
# [2017-07-21 13:19:31] login failed: wrong password, admin => 123456
注:logging.basicConfig
方法需要在輸出日志前調用蛹批,否則無法生效撰洗。
Logging.Handler
用于處理日志,將適當?shù)娜罩颈4娴街付ㄎ恢?/p>
配置
handler.setLevel()
方法與logger中一樣腐芍,指定將發(fā)送到適當目標的最低嚴重性差导。為什么有兩種setLevel()
方法?logger中設置的級別決定了將其傳遞給其handler的消息的嚴重程度甸赃。每個handler中設置的級別決定自身將發(fā)送哪些消息柿汛。
handler.setFormatter()
為handler設置Formatter。
handler.addFilter()
并handler.removeFilter()
為handler增刪Filter埠对。
使用方法
Logging.Handler
是一個基類络断,用于定義接口,因此不應該被實例化项玛。需要建立子類并實現(xiàn)接口貌笨。
常見的子類:
子類 | 描述 |
---|---|
StreamHandler | 發(fā)送日志信息到stream |
FileHandler | 發(fā)送日志信息到文件 |
SMTPHandler | 發(fā)送日志信息到郵箱 |
HTTPHandler | 使用get或post發(fā)送日志信息到http服務器 |
Logging.Formatter
用于日志的格式化
使用方法
# 創(chuàng)建logger并設置日志級別
logger = logging.getLogger('test')
logger.setLevel(logging.DEBUG)
# 創(chuàng)建handler并設置日志級別
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# 創(chuàng)建formatter并添加至handler
formatter = logging.Formatter(fmt='[%(asctime)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter)
# 將handler添加至logger
logger.addHandler(handler)
# 使用logger
logger.debug('log debug')
# [2017-07-22 09:10:07] log debug
模塊級函數(shù)
logging.getLogger(name=None)
獲取指定name
的logger實例,當name=None
時襟沮,返回name
為root的logger實例锥惋。
logging.getLoggerClass()
獲取logger的類,一般用于子類的繼承开伏。
logging.basicConfig(**kwargs)
對日志系統(tǒng)進行基礎的配置膀跌,該函數(shù)會根據(jù)args為root logger創(chuàng)建StreamHandler和默認的Formatter,以下為logging.basicConfig(**kwargs)
參數(shù)的描述:
參數(shù) | 描述 |
---|---|
filename | 指定一個文件名來創(chuàng)建FileHandler固灵,這將取代默認的StreamHandler |
filemode | 如果文件名已指定捅伤,改參數(shù)將指定文件打開方式,默認‘a(chǎn)’ |
format | 為handler指定字符串格式 |
datefmt | 指定時間/日期格式 |
style | 3.2版本加入巫玻,如果format已指定丛忆,改參數(shù)將修改格式串的風格,默認‘%’ |
level | 為root logger指定日志等級 |
stream | 指定流來初始化StreamHandler仍秤。改參數(shù)與filename參數(shù)無法兼容熄诡,否則將會報錯ValueError |
handlers | 3.3版本加入,為root logger指定Handler诗力,如果format沒有指定將會使用默認formatter凰浮。改參數(shù)與filename、stream不兼容苇本,否則將會報錯ValueError |
線程安全
logging模塊是線程安全的导坟。它通過使用線程鎖實現(xiàn)這一點;有一個鎖來序列化訪問模塊的共享數(shù)據(jù),每個處理程序也創(chuàng)建一個鎖來序列化對其底層I / O的訪問圈澈。
如果使用signal模塊來實現(xiàn)異步信號處理程序,則在該程序中無法使用logging模塊尘惧。
使用起來
總結
以上為自己在學習logging模塊時的記錄康栈,如有錯誤請各位指正,謝謝。