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

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