用于便捷記錄日志且線程安全的模塊
1、日志級別
日志一共分成5個等級,從低到高分別是:DEBUG INFO WARNING ERROR CRITICAL。
DEBUG:詳細的信息,通常只出現(xiàn)在診斷問題上
INFO:確認一切按預期運行
WARNING:一個跡象表明,一些意想不到的事情發(fā)生了,或表明一些問題在不久的將來(例如。磁盤空間低”)。這個軟件還能按預期工作。
ERROR:更嚴重的問題,軟件沒能執(zhí)行一些功能
CRITICAL:一個嚴重的錯誤,這表明程序本身可能無法繼續(xù)運行。
這5個等級,也分別對應5種打日志的方法: debug 、info 、warning 、error 、critical。
默認的是WARNING,當在WARNING或之上時才被跟蹤。
2、日志輸出
有兩種方式記錄跟蹤,一種輸出控制臺,另一種是記錄到文件中,如日志文件。
3、注意問題
用Python的logging模塊記錄日志時,遇到了重復記錄日志的問題,第一條記錄寫一次,第二條記錄寫兩次,第三條記錄寫三次。。。這樣記日志可不行。
原因:沒有移除handler
解決:在日志記錄完之后removeHandler
使用方法
1、單日志文件
創(chuàng)建一個日志模塊.py的文件
import logging
logging.basicConfig(filename='log.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=10)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log')
運行:
從運行結(jié)果來看,創(chuàng)建了一個log.log日志文件,時間是自動生產(chǎn)的,module是我們當前的python代碼文件名。
日志等級:
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
注:只有【當前寫等級】大于【日志等級】時,日志文件才被記錄。
日志記錄格式:
%(name)s Logger的名字
%(levelno)s 數(shù)字形式的日志級別
%(levelname)s 文本形式的日志級別
%(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ù)表示
%(relativeCreated)d 輸出日志信息時的,自Logger創(chuàng)建以 來的毫秒數(shù)
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒
%(thread)d 線程ID。
%(threadName)s 線程名。
%(process)d 進程ID。
%(message)s 用戶輸出的消息
2、多文件日志
對于上述記錄日志的功能,只能將日志記錄在單文件中,如果想要設(shè)置多個日志文件,logging.basicConfig將無法完成,需要自定義文件和日志操作對象。
import logging
# 定義文件
file1 = logging.FileHandler(filename='l1.log', mode='a', encoding='utf-8')
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
file1.setFormatter(fmt)
file2 = logging.FileHandler(filename='l2.log', mode='a', encoding='utf-8')
fmt = logging.Formatter()
file2.setFormatter(fmt)
# 定義日志
logger1 = logging.Logger(name='這里是name', level=logging.ERROR)
logger1.addHandler(file1)
logger1.addHandler(file2)
# logger1.removeHandler(file1)
# logger1.removeHandler(file2)
# 寫日志
logger1.error(msg='這里是msg111')
logger1.log(msg='這里是msg222', level=50)
# 定義文件
file3 = logging.FileHandler(filename='l3.log', mode='a', encoding='utf-8')
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
file3.setFormatter(fmt)
# 定義日志
logger2 = logging.Logger(name='這里是name222222', level=logging.INFO)
logger2.addHandler(file3)
# 寫日志
logger2.info('這里是msg333333')
運行:
如上述創(chuàng)建的兩個日志對象
- 當使用【logger1】寫日志時,會將相應的內(nèi)容寫入 l1.log 和 l2.log 文件中
- 當使用【logger2】寫日志時,會將相應的內(nèi)容寫入 l3.log 文件中