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