真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Pythonlogging模塊

logging模塊簡(jiǎn)介

logging模塊是Python的一個(gè)標(biāo)準(zhǔn)庫(kù)模塊,開發(fā)過程中,可以通過該模塊,靈活的完成日志的記錄。

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作與策劃設(shè)計(jì),嘉禾網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:嘉禾等地區(qū)。嘉禾做網(wǎng)站價(jià)格咨詢:18982081108

logging模塊提供了兩種記錄日志的方式:
????1)使用logging提供的模塊級(jí)別的函數(shù)(logging.basicConfig,logging.debug,logging.info...)
????2)使用logging模塊的組件(loggers,handlers,filters,formatters)

下面會(huì)分別介紹這兩種方式,這里建議使用第二種方式,使用 logging模塊的組件可以更靈活的完成日志記錄~

logging模塊的日志級(jí)別

logging模塊的日志級(jí)別(level)包括:DEBUG,INFO,WARNING,ERROR,CRITICAL~

日志級(jí)別(level)描述
DEBUG 調(diào)試級(jí)別,一般用于問題的排查,日志的信息最為詳細(xì)
INFO 僅記錄普通的信息,日志信息的詳細(xì)程度僅次于DEBUG
WARNING 警告信息,一般這類信息不會(huì)影響程序的正常運(yùn)行
ERROR 錯(cuò)誤信息, 出現(xiàn)錯(cuò)誤信息時(shí),程序一般已不能正常運(yùn)行
CRITICAL 更嚴(yán)重的錯(cuò)誤信息,程序不能繼續(xù)運(yùn)行

從 DEBUG 到 CRITICAL,日志等級(jí)依次提高,即嚴(yán)重性逐步提升,日志的信息量依次減少:
DEBUG < INFO < WARNING < ERROR < CRITICAL

通過logging模塊級(jí)別的函數(shù)記錄日志

示例如下:

import logging  
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')  

輸出結(jié)果:
WARNING:root:warning message     # 默認(rèn)的日志格式:日志級(jí)別 : Logger名稱 : 用戶輸出消息。
ERROR:root:error message
CRITICAL:root:critical message

這里僅輸出了大于等于WARNING級(jí)別的日志,說(shuō)明 logging模塊 默認(rèn)的日志級(jí)別為WARNING,即日志級(jí)別大于等于WARNING的才會(huì)被輸出,且默認(rèn)情況下,日志會(huì)直接打印到標(biāo)準(zhǔn)輸出中~
?
通過 logging模塊 的basicConfig函數(shù)可靈活地配置日志級(jí)別,日志格式以及日志的輸出位置:

import logging

logging.basicConfig(level=logging.DEBUG, 
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',                       # 日志格式
                    datefmt='%Y-%m-%d %H:%M:%S',    # 時(shí)間格式:2018-11-12 23:50:21
                    filename='/tmp/test.log',    # 日志的輸出路徑
                    filemode='a')                      # 追加模式

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

程序運(yùn)行后,日志信息會(huì)直接記錄到 指定的文件中(/tmp/test.log),且日志級(jí)別為DEBUG,所以所有的日志都會(huì)被輸出,日志信息如下:

?  ~ cat /tmp/test.log

2018-11-12 23:50:49 test.py[line:9] DEBUG debug message
2018-11-12 23:50:49 test.py[line:10] INFO info message
2018-11-12 23:50:49 test.py[line:11] WARNING warning message
2018-11-12 23:50:49 test.py[line:12] ERROR error message
2018-11-12 23:50:49 test.py[line:13] CRITICAL critical message

?
logging.basicConfig()函數(shù)中可通過具體參數(shù)來(lái)更改logging模塊默認(rèn)行為,可用參數(shù)有:

filename:用指定的文件名創(chuàng)建FiledHandler,這樣日志會(huì)被存儲(chǔ)在指定的文件中。
filemode:文件打開方式,在指定了filename時(shí)使用這個(gè)參數(shù),默認(rèn)值為“a”還可指定為“w”。
format:指定handler使用的日志顯示格式。
datefmt:指定日期時(shí)間格式。
level:設(shè)置rootlogger(后邊會(huì)講解具體概念)的日志級(jí)別
stream:用指定的stream創(chuàng)建StreamHandler??梢灾付ㄝ敵龅絪ys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認(rèn)為sys.stderr。若同時(shí)列出了filename和stream兩個(gè)參數(shù),則stream參數(shù)會(huì)被忽略。
?
format參數(shù)中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數(shù)字形式的日志級(jí)別
%(levelname)s 文本形式的日志級(jí)別
%(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ù)的語(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)格式是 “2018-11-13 00:00:00,896”。逗號(hào)后面的是毫秒
%(thread)d 線程ID??赡軟]有
%(threadName)s 線程名??赡軟]有
%(process)d 進(jìn)程ID??赡軟]有
%(message)s用戶輸出的消息

通過logging模塊的組件記錄日志

使用logging模塊級(jí)別的函數(shù)記錄日志,無(wú)法實(shí)現(xiàn)將日志輸出到多個(gè)路徑下。這里logging模塊提供了4個(gè)組件,通過這些組件可實(shí)現(xiàn)將日志輸出到多個(gè)路徑下,且每個(gè)路徑下的日志格式可單獨(dú)配置~

logging模塊中用于記錄日志的4大組件

組件名稱功能描述
Logger 日志器,提供了應(yīng)用程序可一直使用的接口
Handler 將 logger 產(chǎn)生的日志發(fā)送到指定的路徑下(例如可以是終端,也可以是文件)
Filter 若有多個(gè) Logger,可根據(jù)名稱過濾出指定的 Logger 來(lái)記錄日志
Formatter 定義日志格式

logging模塊組件的使用

使用組件記錄日志的大致步驟如下:
1)logging.getLogger() 獲取 logger對(duì)象
2)創(chuàng)建一個(gè)或多個(gè) handler,用于指定日志信息的輸出流向
3)創(chuàng)建一個(gè)或多個(gè) formatter,指定日志的格式,并分別將 formatter 綁定到 上
4)將 handler 綁定到 logger對(duì)象 上
5)logger.setLevel(logging.DEBUG) 設(shè)置日志級(jí)別
5)最后便可使用 logger對(duì)象 記錄日志~
?
示例

import logging

# 獲取 logger對(duì)象
logger = logging.getLogger()

# 創(chuàng)建一個(gè) handler,用于寫入日志文件
fh = logging.FileHandler('/tmp/test.log')

# 再創(chuàng)建一個(gè) handler,用于輸出到控制臺(tái)
ch = logging.StreamHandler()

# 創(chuàng)建一個(gè) formatter,兩個(gè) handler 使用相同的日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 綁定 formatter 到 handler 上
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 綁定 handler 到 logger對(duì)象 上
logger.addHandler(fh) #logger對(duì)象可以添加多個(gè)fh和ch對(duì)象
logger.addHandler(ch)

# 設(shè)置日志級(jí)別
logger.setLevel(logging.WARNING)

logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

查看輸出結(jié)果:

終端輸出:
2018-11-13 23:14:09,161 - root - WARNING - logger warning message
2018-11-13 23:14:09,161 - root - ERROR - logger error message
2018-11-13 23:14:09,161 - root - CRITICAL - logger critical message

文件輸出:
?  ~ cat /tmp/test.log
2018-11-13 23:14:09,161 - root - WARNING - logger warning message
2018-11-13 23:14:09,161 - root - ERROR - logger error message
2018-11-13 23:14:09,161 - root - CRITICAL - logger critical message

也可以通過 handler 來(lái)設(shè)置日志級(jí)別,當(dāng)使用 handler 來(lái)設(shè)置日志級(jí)別時(shí),存在如下兩種情況:
???1)若 handler 設(shè)置的日志級(jí)別小于等于 logger 的日志級(jí)別時(shí),則以logger 的日志級(jí)別為準(zhǔn);
???2)若 handler 設(shè)置的日志級(jí)別大于 logger 的日志級(jí)別時(shí),則以handler 的日志級(jí)別為準(zhǔn);
簡(jiǎn)單而言就是,兩者同時(shí)設(shè)置日志級(jí)別,以日志級(jí)別高的為準(zhǔn)。由于不設(shè)置 logger 的日志級(jí)別,其默認(rèn)日志級(jí)別就是 WARNING,所以不存在 handler 單獨(dú)設(shè)置日志級(jí)別的情況~

通過示例來(lái)驗(yàn)證:
1)logger 日志級(jí)別設(shè)置為 DEBUG,logger 不設(shè)置(默認(rèn)為WARNING)

import logging

logger = logging.getLogger()
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

ch.setLevel(logging.DEBUG)
# logger.setLevel(logging.CRITICAL)

ch.setFormatter(formatter)
logger.addHandler(ch)

logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

輸出結(jié)果:
2018-11-13 23:40:13,829 - root - WARNING - logger warning message
2018-11-13 23:40:13,829 - root - ERROR - logger error message
2018-11-13 23:40:13,829 - root - CRITICAL - logger critical message

2)logger 日志級(jí)別設(shè)置為 CRITICAL,logger 設(shè)置為 ERROR

import logging

logger = logging.getLogger()
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

ch.setLevel(logging.CRITICAL)
logger.setLevel(logging.ERROR)

ch.setFormatter(formatter)
logger.addHandler(ch)

logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

輸出結(jié)果:
2018-11-13 23:41:51,279 - root - CRITICAL - logger critical message

filter組件 的使用

filter組件用來(lái)過濾 logger 對(duì)象,一個(gè) filter 可以直接添加到 logger對(duì)象上,也可以添加到 handler 對(duì)象上。
 
例如,定義一個(gè)filter: filter = logging.Filter('a.b'),當(dāng)把這個(gè) filter 添加到一個(gè) handler 上,那么綁定了該 handler 的 多個(gè) logger對(duì)象中,只有名字是 'a.b' 前綴的才能通過該 handler 輸出日志~
 
在 handler 上添加 filter:

import logging

logger1 = logging.getLogger('a.b.c')
logger2 = logging.getLogger('a.c')

# 定義一個(gè) filter
filter = logging.Filter(name='a.b')

# 定義一個(gè) handler
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)

# 若兩個(gè) logger對(duì)象 的日志級(jí)別相同,且都是用通過一個(gè) handler,可以在這個(gè) handler 上設(shè)置日志級(jí)別
ch.setLevel(logging.ERROR)

# 在 handler 上放置過濾器
ch.addFilter(filter)

logger1.addHandler(ch)
logger2.addHandler(ch)
logger1.error('logger1 error message')
logger2.error('logger2 error message')

輸出結(jié)果:
2018-11-15 21:58:33,409 - a.b.c - ERROR - logger1 error message

可以看到 logger2 被過濾,只有 logger1 輸出日志~
 
在 handler 上添加 filter:

import logging

logger1 = logging.getLogger('a.b.c')
logger2 = logging.getLogger('a.c')

# 定義一個(gè) filter
filter = logging.Filter(name='a.b')

# 定義一個(gè) handler
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)

# 若兩個(gè) logger對(duì)象 的日志級(jí)別相同,且都是用通過一個(gè) handler,可以在這個(gè) handler 上設(shè)置日志級(jí)別
ch.setLevel(logging.ERROR)

# 在 logger 上放置過濾器
logger1.addFilter(filter)
logger2.addFilter(filter)

logger1.addHandler(ch)
logger2.addHandler(ch)
logger1.error('logger1 error message')
logger2.error('logger2 error message')

輸出結(jié)果一致,即僅有 logger1 輸出日志。將 filter 添加到 logger 上,這個(gè)filter將直接作用于這個(gè) logger,貌似這么意義不大,很少這樣使用

.................^_^


文章名稱:Pythonlogging模塊
文章URL:http://weahome.cn/article/ihehij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部