本篇文章主要對 python logging 的介紹加深理解。更主要是 討論在多進程環境下如何使用logging 來輸出日志, 如何安全地切分日志文件。
1. logging日志模塊介紹
python的logging模塊提供了靈活的標準模塊,使得任何Python程序都可以使用這個第三方模塊來實現日志記錄。python logging 官方文檔
logging框架中主要由四個部分組成:
2. logging的組成
loggers
loggers 就是程序可以直接調用的一個日志接口,可以直接向logger寫入日志信息。logger并不是直接實例化使用的,而是通過logging.getLogger(name)來獲取對象,事實上logger對象是單例模式,logging是多線程安全的,也就是無論程序中哪里需要打日志獲取到的logger對象都是同一個。但是不幸的是logger并不支持多進程,這個在后面的章節再解釋,并給出一些解決方案。
【注意】loggers對象是有父子關系的,當沒有父logger對象時它的父對象是root,當擁有父對象時父子關系會被修正。舉個例子logging.getLogger("abc.xyz")會創建兩個logger對象,一個是abc父對象,一個是xyz子對象,同時abc沒有父對象所以它的父對象是root。但是實際上abc是一個占位對象(虛的日志對象),可以沒有handler來處理日志。但是root不是占位對象,如果某一個日志對象打日志時,它的父對象會同時收到日志,所以有些使用者發現創建了一個logger對象時會打兩遍日志,就是因為他創建的logger打了一遍日志,同時root對象也打了一遍日志。
每個logger都有一個日志的級別。logging中定義了如下級別
| Level | Numeric value |
|---|---|
| NOTSET | 0 |
| DEBUG | 10 |
| INFO | 20 |
| WARNING | 30 |
| ERROR | 40 |
| CRITICAL | 50 |
當一個logger收到日志信息后先判斷是否符合level,如果決定要處理就將信息傳遞給Handlers進行處理。
Handlers
Handlers 將logger發過來的信息進行準確地分配,送往正確的地方。舉個栗子,送往控制臺或者文件或者both或者其他地方(進程管道之類的)。它決定了每個日志的行為,是之后需要配置的重點區域。
每個Handler同樣有一個日志級別,一個logger可以擁有多個handler也就是說logger可以根據不同的日志級別將日志傳遞給不同的handler。當然也可以相同的級別傳遞給多個handlers這就根據需求來靈活的設置了。
新聞熱點
疑難解答