小編給大家分享一下Python中精選的logging模塊是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比仁布網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式仁布網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋仁布地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
用Python寫代碼的時(shí)候,在想看的地方寫個(gè)print(xx) 就能在控制臺(tái)上顯示打印信息,這樣子就能知道它是什么了,但是當(dāng)我需要看大量的地方或者在一個(gè)文件中查看的時(shí)候,這時(shí)候print就不大方便了,所以Python引入了logging模塊來記錄想要的信息。
1 日志級(jí)別
import logging # 引入logging模塊 # 將信息打印到控制臺(tái)上 logging.debug(u"debug") logging.info(u"info") logging.warning(u"warning") logging.error(u"error") logging.critical(u"critical")
回顯:
上面可以看到只有后面三個(gè)能打印出來
默認(rèn)生成的root logger的level是logging.WARNING,低于該級(jí)別的就不輸出了
級(jí)別排序:CRITICAL > ERROR > WARNING > INFO > DEBUG
debug : 打印全部的日志,詳細(xì)的信息,通常只出現(xiàn)在診斷問題上
info : 打印info,warning,error,critical級(jí)別的日志,確認(rèn)一切按預(yù)期運(yùn)行
warning : 打印warning,error,critical級(jí)別的日志,一個(gè)跡象表明,一些意想不到的事情發(fā)生了,或表明一些問題在不久的將來(例如。磁盤空間低”),這個(gè)軟件還能按預(yù)期工作
error : 打印error,critical級(jí)別的日志,更嚴(yán)重的問題,軟件沒能執(zhí)行一些功能
critical : 打印critical級(jí)別,一個(gè)嚴(yán)重的錯(cuò)誤,這表明程序本身可能無法繼續(xù)運(yùn)行
這時(shí)候,如果需要顯示低于WARNING級(jí)別的內(nèi)容,可以引入NOTSET級(jí)別來顯示:
import logging # 引入logging模塊 logging.basicConfig(level=logging.NOTSET) # 設(shè)置日志級(jí)別 logging.debug(u"如果設(shè)置了日志級(jí)別為NOTSET,那么這里可以采取debug、info的級(jí)別的內(nèi)容也可以顯示在控制臺(tái)上了")
回顯:
2 部分名詞解釋
print也可以輸入日志,logging相對(duì)print來說更好控制輸出在哪個(gè)地方,怎么輸出及控制消息級(jí)別來過濾掉那些不需要的信息。
Logging.Formatter:這個(gè)類配置了日志的格式,在里面自定義設(shè)置日期和時(shí)間,輸出日志的時(shí)候?qū)?huì)按照設(shè)置的格式顯示內(nèi)容。
Logging.Logger:Logger是Logging模塊的主體,進(jìn)行以下三項(xiàng)工作:
1、為程序提供記錄日志的接口
2、判斷日志所處級(jí)別,并判斷是否要過濾
3、根據(jù)其日志級(jí)別將該條日志分發(fā)給不同handler
常用函數(shù)有:
Logger.setLevel() 設(shè)置日志級(jí)別
Logger.addHandler() 和 Logger.removeHandler() 添加和刪除一個(gè)Handler
Logger.addFilter() 添加一個(gè)Filter,過濾作用
Logging.Handler:Handler基于日志級(jí)別對(duì)日志進(jìn)行分發(fā),如設(shè)置為WARNING級(jí)別的Handler只會(huì)處理WARNING及以上級(jí)別的日志。
3 日志輸出-控制臺(tái)
import logging # 引入logging模塊 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') # logging.basicConfig函數(shù)對(duì)日志的輸出格式及方式做相關(guān)配置 # 由于日志基本配置中級(jí)別設(shè)置為DEBUG,所以一下打印信息將會(huì)全部顯示在控制臺(tái)上 logging.info('this is a loggging info message') logging.debug('this is a loggging debug message') logging.warning('this is loggging a warning message') logging.error('this is an loggging error message') logging.critical('this is a loggging critical message')
上面代碼通過logging.basicConfig函數(shù)進(jìn)行配置了日志級(jí)別和日志內(nèi)容輸出格式;因?yàn)榧?jí)別為DEBUG,所以會(huì)將DEBUG級(jí)別以上的信息都輸出顯示再控制臺(tái)上。
回顯:
4 日志輸出-文件
import logging # 引入logging模塊 import os import time # 第一步,創(chuàng)建一個(gè)logger logger = logging.getLogger() logger.setLevel(logging.INFO) # Log等級(jí)總開關(guān) # 第二步,創(chuàng)建一個(gè)handler,用于寫入日志文件 rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) log_path = os.path.dirname(os.getcwd()) + '/Logs/' # 如果日志目錄不存在,就創(chuàng)建 if not os.path.exists(log_path): os.mkdir(log_path) log_name = log_path + rq + '.log' logfile = log_name fh = logging.FileHandler(logfile, mode='w') fh.setLevel(logging.DEBUG) # 輸出到file的log等級(jí)的開關(guān) # 第三步,定義handler的輸出格式 formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s") fh.setFormatter(formatter) # 第四步,將logger添加到handler里面 logger.addHandler(fh) # 日志 logger.debug('this is a logger debug message') logger.info('this is a logger info message') logger.warning('this is a logger warning message') logger.error('this is a logger error message') logger.critical('this is a logger critical message')
回顯(打開同一目錄下生成的文件):
文件內(nèi)容:
5 日志輸出-控制臺(tái)和文件
只要在輸入到日志中的第三步和第四步插入一個(gè)handler輸出到控制臺(tái):
# 創(chuàng)建一個(gè)handler,用于輸出到控制臺(tái) ch = logging.StreamHandler() ch.setLevel(logging.WARNING) # 輸出到console的log等級(jí)的開關(guān) # 第三步和第四步分別加入以下代碼即可 ch.setFormatter(formatter) logger.addHandler(ch)
6 format常用格式說明
%(levelno)s: 打印日志級(jí)別的數(shù)值
%(levelname)s: 打印日志級(jí)別名稱
%(pathname)s: 打印當(dāng)前執(zhí)行程序的路徑,其實(shí)就是sys.argv[0]
%(filename)s: 打印當(dāng)前執(zhí)行程序名
%(funcName)s: 打印日志的當(dāng)前函數(shù)
%(lineno)d: 打印日志的當(dāng)前行號(hào)
%(asctime)s: 打印日志的時(shí)間
%(thread)d: 打印線程ID
%(threadName)s: 打印線程名稱
%(process)d: 打印進(jìn)程ID
%(message)s: 打印日志信息
7 捕捉異常,用traceback記錄
import os.path import time import logging # 創(chuàng)建一個(gè)logger logger = logging.getLogger() logger.setLevel(logging.INFO) # Log等級(jí)總開關(guān) # 創(chuàng)建一個(gè)handler,用于寫入日志文件 rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) log_path = os.path.dirname(os.getcwd()) + '/Logs/' # 如果日志目錄不存在,就創(chuàng)建 if not os.path.exists(log_path): os.mkdir(log_path) log_name = log_path + rq + '.log' logfile = log_name fh = logging.FileHandler(logfile, mode='w') fh.setLevel(logging.DEBUG) # 輸出到file的log等級(jí)的開關(guān) # 定義handler的輸出格式 formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s") fh.setFormatter(formatter) logger.addHandler(fh) # 使用logger.XX來記錄錯(cuò)誤,這里的"error"可以根據(jù)所需要的級(jí)別進(jìn)行修改 try: open('/path/to/does/not/exist', 'rb') except (SystemExit, KeyboardInterrupt): raise except Exception as e: logger.error('Failed to open file', exc_info=True)
回顯(存儲(chǔ)在文件中):
如果需要將日志不上報(bào)錯(cuò)誤,僅記錄,可以將exc_info=False,回顯如下:
8 多模塊調(diào)用logging,日志輸出順序
warning_output.py
import logging def write_warning(): logging.warning(u"記錄文件warning_output.py的日志")
error_output.py
import logging def write_error(): logging.error(u"記錄文件error_output.py的日志")
main.py
import logging import warning_output import error_output def write_critical(): logging.critical(u"記錄文件main.py的日志") warning_output.write_warning() # 調(diào)用warning_output文件中write_warning方法 write_critical() error_output.write_error() # 調(diào)用error_output文件中write_error方法
回顯:
從上面來看,日志的輸出順序和模塊執(zhí)行順序是一致的。
9 日志滾動(dòng)和過期刪除
# coding:utf-8 import logging import time import re from logging.handlers import TimedRotatingFileHandler from logging.handlers import RotatingFileHandler def backroll(): # 日志打印格式 log_fmt = '%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s' formatter = logging.Formatter(log_fmt) # 創(chuàng)建TimedRotatingFileHandler對(duì)象 log_file_handler = TimedRotatingFileHandler(filename="ds_update", when="M", interval=2, backupCount=2) # log_file_handler.suffix = "%Y-%m-%d_%H-%M.log" # log_file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}.log$") log_file_handler.setFormatter(formatter) logging.basicConfig(level=logging.INFO) log = logging.getLogger() log.addHandler(log_file_handler) # 循環(huán)打印日志 log_content = "test log" count = 0 while count < 30: log.error(log_content) time.sleep(20) count = count + 1 log.removeHandler(log_file_handler) if __name__ == "__main__": backroll()
filename:日志文件名的prefix;
when:是一個(gè)字符串,用于描述滾動(dòng)周期的基本單位,字符串的值及意義如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval: 滾動(dòng)周期,單位有when指定,比如:when=’D’,interval=1,表示每天產(chǎn)生一個(gè)日志文件
backupCount: 表示日志文件的保留個(gè)數(shù)
看完了這篇文章,相信你對(duì)Python中精選的logging模塊是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
標(biāo)題名稱:Python中精選的logging模塊是什么
網(wǎng)頁地址:http://www.rwnh.cn/article22/ghdicc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、微信小程序、用戶體驗(yàn)、網(wǎng)站改版、靜態(tài)網(wǎng)站、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)