文章目錄
- 1. Python logging 模塊之 logging.basicConfig 用法和參數(shù)詳解
- 1.1. logging 模塊簡介
- 1.2. `logging.basicConfig(**kwargs)`
- 1.3. LogRecord 屬性
1. Python logging 模塊之 logging.basicConfig 用法和參數(shù)詳解
1.1. logging 模塊簡介
??logging 模塊是 Python 內(nèi)置的標(biāo)準(zhǔn)模塊,主要用于輸出運(yùn)行日志,可以設(shè)置輸出日志的等級(jí)、日志保存路徑、日志文件回滾等;相比 print,具備如下優(yōu)點(diǎn):
- 可以通過設(shè)置不同的日志等級(jí),在 release 版本中只輸出重要信息,而不必顯示大量的調(diào)試信息;
- print 將所有信息都輸出到標(biāo)準(zhǔn)輸出中,嚴(yán)重影響開發(fā)者從標(biāo)準(zhǔn)輸出中查看其它數(shù)據(jù);logging 則可以由開發(fā)者決定將信息輸出到什么地方,以及怎么輸出;
- 和 print 相比,logging 是線程安全的。
線程安全 :線程執(zhí)行一段代碼,不會(huì)產(chǎn)生不確定的結(jié)果,那這段代碼就是線程安全的。
??多線程的時(shí)候執(zhí)行 print 應(yīng)該是一行行打印,但是很多字符串打在了一起,為什么?
??說明,print 函數(shù)被打斷了,被線程切換打斷了。print 函數(shù)分兩步,第一步打印字符串,第二步打印換行符,就在這之間,發(fā)生了線程的切換。這說明 print 函數(shù)是 線程不安全 的。
先舉個(gè)例子:
import
logging
logging
.
basicConfig
(
level
=
logging
.
INFO
,
format
=
'%(asctime)s %(filename)s %(levelname)s %(message)s'
,
datefmt
=
'%a %d %b %Y %H:%M:%S'
,
filename
=
'my.log'
,
filemode
=
'w'
)
logging
.
info
(
'This is a info.'
)
logging
.
debug
(
'This is a debug message.'
)
logging
.
warning
(
'This is a warning.'
)
# 輸出到同目錄下 my.log 文件中的內(nèi)容:
Wed
05
Jun
2019
22
:
25
:
32
test
.
py INFO This
is
a info
.
Wed
05
Jun
2019
22
:
25
:
32
test
.
py WARNING This
is
a warning
.
??請(qǐng)讀者根據(jù)以下參數(shù)自行解讀為什么會(huì)有這樣的輸出。
1.2.
logging.basicConfig(**kwargs)
??使用默認(rèn)格式化程序創(chuàng)建 StreamHandler 并將其添加到根日志記錄器中,從而完成日志系統(tǒng)的基本配置。如果沒有為根日志程序定義處理程序,debug()、info()、warning()、error()和 critical() 函數(shù)將自動(dòng)調(diào)用 basicConfig()。
??如果根日志記錄器已經(jīng)為其配置了處理程序,則此函數(shù)不執(zhí)行任何操作。
注解:這個(gè)函數(shù)應(yīng)該在其他線程啟動(dòng)之前從主線程調(diào)用。在 2.7.1 和 3.2 之前的 Python 版本中,如果從多個(gè)線程調(diào)用此函數(shù),則可能(在很少的情況下)不止一次地將處理程序添加到根日志記錄器中,從而導(dǎo)致意想不到的結(jié)果,比如在日志中消息被復(fù)寫。
??支持以下關(guān)鍵字參數(shù)。
格式 | 描述 |
---|---|
filename | 指定使用 指定的文件名 而不是 StreamHandler 創(chuàng)建 FileHandler。 |
filemode | 如果指定 filename,則以此模式打開文件(‘r’、‘w’、‘a(chǎn)’)。默認(rèn)為“a”。 |
format | 為處理程序使用指定的格式字符串。 |
datefmt | 使用 time.strftime() 所接受的指定日期/時(shí)間格式。 |
style | 如果指定了格式,則對(duì)格式字符串使用此樣式。’%’ 用于 printf 樣式、’{’ 用于 str.format()、’$’ 用于 string。默認(rèn)為“%”。 |
level | 將根記錄器級(jí)別設(shè)置為指定的級(jí)別。默認(rèn)生成的 root logger 的 level 是 logging.WARNING,低于該級(jí)別的就不輸出了。級(jí)別排序:CRITICAL > ERROR > WARNING > INFO > DEBUG。(如果需要顯示所有級(jí)別的內(nèi)容,可將 level=logging.NOTSET) |
stream | 使用指定的流初始化 StreamHandler。注意,此參數(shù)與 filename 不兼容——如果兩者都存在,則會(huì)拋出 ValueError。 |
handlers | 如果指定,這應(yīng)該是已經(jīng)創(chuàng)建的處理程序的迭代,以便添加到根日志程序中。任何沒有格式化程序集的處理程序都將被分配給在此函數(shù)中創(chuàng)建的默認(rèn)格式化程序。注意,此參數(shù)與 filename 或 stream 不兼容——如果兩者都存在,則會(huì)拋出 ValueError。 |
1.3. LogRecord 屬性
??LogRecord 有許多屬性,其中大部分是從構(gòu)造函數(shù)的參數(shù)派生出來的。(注意,名稱并不總是與 LogRecord 構(gòu)造函數(shù)參數(shù)和 LogRecord 屬性完全對(duì)應(yīng)。)這些屬性可用于將記錄中的數(shù)據(jù)合并到格式字符串中。下表以 % 樣式的格式字符串列出(按字母順序)屬性名、它們的含義和對(duì)應(yīng)的占位符。
??如果您使用 {} 格式 (str.format()),可以使用 {attrname} 作為格式字符串中的占位符。如果您正在使用
$-formatting
(string.Template),請(qǐng)使用
${attrname}
格式。當(dāng)然,在這兩種情況下,都要用想要使用的實(shí)際屬性名替換 attrname。
??在使用 {} 格式的情況下,您可以通過將它們放在屬性名后面來指定格式化標(biāo)志,并使用冒號(hào)將它們與屬性名分隔開。例如
{msecs:03d}
的占位符將把毫秒值 4 格式化為 004。有關(guān)可用選項(xiàng)的詳細(xì)信息,請(qǐng)參閱
str.format()
文檔。
屬性名稱 | 格式 | 描述 |
---|---|---|
args | 您不應(yīng)該自己設(shè)置此格式。 | 參數(shù)組成的元組合并到 msg 中以生成消息,或 dict,其值用于合并(當(dāng)只有一個(gè)參數(shù)時(shí),它是一個(gè)字典)。 |
asctime |
%(asctime)s
|
創(chuàng)建日志記錄時(shí)的時(shí)間(以便于人識(shí)讀的格式)。默認(rèn)情況下,它的形式是“2003-07-08 16:49:45,896”(逗號(hào)后面的數(shù)字是時(shí)間的毫秒部分)。 |
created |
%(created)f
|
創(chuàng)建日志記錄的時(shí)間(由 time.time() 函數(shù)返回的時(shí)間戳(1970紀(jì)元后經(jīng)過的浮點(diǎn)秒數(shù)))。 |
exc_info | 您不應(yīng)該自己設(shè)置此格式。 | 異常元組(如 sys.exc_info),如果沒有發(fā)生異常,則為 None。 |
filename |
%(filename)s
|
路徑名 的 文件名 部分。 |
funcName |
%(funcName)s
|
包含日志記錄調(diào)用的函數(shù)的名稱。 |
levelname |
%(levelname)s
|
消息的文本日志級(jí)別(‘DEBUG’、‘INFO’、‘WARNING’、‘ERROR’、‘CRITICAL’)。 |
levelno |
%(levelno)s
|
消息的數(shù)字日志級(jí)別(NOTSET-0、DEBUG-10、INFO-20、WARNING-30、ERROR-40、CRITICAL-50)。 |
lineno |
%(lineno)d
|
發(fā)出日志調(diào)用的源行號(hào)(如果可用)。 |
message |
%(message)s
|
已記錄的消息,計(jì)算為 msg % args。這是在調(diào)用 Formatter.format() 時(shí)設(shè)置的。 |
module |
%(module)s
|
模塊(文件名的名稱部分)。 |
msecs |
%(msecs)d
|
創(chuàng)建日志記錄時(shí)的毫秒部分。 |
msg | 您不應(yīng)該自己設(shè)置此格式。 | 在原始日志記錄調(diào)用中傳遞的格式字符串。與 args 合并以生成消息或任意對(duì)象(請(qǐng)參閱使用任意對(duì)象作為消息)。 |
name |
%(name)s
|
用于記錄調(diào)用的日志程序的名稱。 |
pathname |
%(pathname)s
|
發(fā)出日志調(diào)用的源文件的完整路徑名(如果可用)。 |
process |
%(process)d
|
進(jìn)程ID(如果可用)。 |
processName |
%(processName)s
|
進(jìn)程名(如果可用)。 |
relativeCreated |
%(relativeCreated)d
|
創(chuàng)建日志記錄的時(shí)間(以毫秒為單位)相對(duì)于加載日志模塊的時(shí)間。 |
stack_info | 您不應(yīng)該自己設(shè)置此格式。 | 堆棧幀信息(在可用的情況下)從當(dāng)前線程的堆棧底部開始,直到并包括導(dǎo)致創(chuàng)建此記錄的日志調(diào)用的堆棧幀。 |
thread |
%(thread)d
|
線程ID(如果可用)。 |
threadName |
%(threadName)s
|
線程名(如果可用)。 |
??以上內(nèi)容翻譯整理自 Python 官方文檔 16.6. logging — Logging facility for Python — Python 3.6.8 documentation
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
