【Python程式設計】Python_logging 模組
Python_logging 模組
一、日誌的作用?
在每天運維人員的工作中,接觸伺服器還是很多的,比如:web伺服器,有可能有一個服務宕了,我們都會去看它的日誌,比如web服務Nginx為例:Nginx啟動失敗,首先我們會去它安裝路徑查詢error.log這個日誌,因為這個日誌裡面存放著內容:告訴你為什麼nginx會啟動失敗,有很多原因,所以在這裡日誌起到了很大的作用,它不僅能為運維人員提供幫助,同時也可以給研發人員進行日誌參考來除錯程式碼,及時發現問題並快速定位、解決問題,補救損失。
1、日誌的等級
在日誌中有五個等級如下:
- debug:這是一個debug日誌的級別,是一個詳細資訊日誌。
- info:這是一個info日誌的級別,證明事情按預期工作。 關鍵事件。
- warning:這是一個warning日誌級別,是一個警告日誌。
- error:這是一個error日誌級別,是一個錯誤日誌。
- critical:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌(災難)
在使用日誌的時候,我們需要匯入logging模組。 debug info等等日誌級別就是logging裡面的一些方法,後面加上需要輸出的內容就可以了。
例如1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging. debug("這是一個debug日誌的級別,是一個詳細資訊日誌")
logging.info("這是一個info日誌的級別,是一個確認事情按預期工作的日誌")
logging.warning("這是一個warning的日誌級別,是一個警告的日誌")
logging.error("這是一個error的日誌級別,是一個錯誤的日誌")
logging.critical("這是一個critical日誌級別,是一個非常嚴重錯誤的日誌")
# 以下為輸出的結果
>>>
WARNING:root:這是一個warning的日誌級別,是一個警告的日誌
ERROR:root:這是一個error的日誌級別,是一個錯誤的日誌
CRITICAL: root:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌
注意:在5個日誌級別等級中,預設的等級是warning,所以預設輸出warning等級以上的日誌資訊,如:warning error critical
2、配置日誌的等級
在以上的例子中可以看出,預設輸出的是warning以上的等級日誌資訊,更改等級配置可以通過logging.besicConfig方法來做一些日誌等級的配置
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(level="DEBUG") # 我們可以使用basicConfig來配置日誌的等級。
logging.debug("這是一個debug日誌的級別,是一個詳細資訊日誌")
logging.info("這是一個info日誌的級別,是一個確認事情按預期工作的日誌")
logging.warning("這是一個warning的日誌級別,是一個警告的日誌")
logging.error("這是一個error的日誌級別,是一個錯誤的日誌")
logging.critical("這是一個critical日誌級別,是一個非常嚴重錯誤的日誌")
# 以下為輸出的結果:
DEBUG:root:這是一個debug日誌的級別,是一個詳細資訊日誌
INFO:root:這是一個info日誌的級別,是一個確認事情按預期工作的日誌
WARNING:root:這是一個warning的日誌級別,是一個警告的日誌
ERROR:root:這是一個error的日誌級別,是一個錯誤的日誌
CRITICAL:root:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌
那麼使用logging.basicConfig就可以對日誌的等級進行配置 後面加:level="日誌的等級"
3、配置日誌的輸出資訊
有時候我們需要輸出一些內容,比如access.log日誌一樣,有時間,網址,狀態碼,使用者等等
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
# 同時還是使用basicConfig來配置,levelname就是日誌等級的意思,message就是日誌的內容。
>>>
DEBUG:這是一個debug日誌的級別,是一個詳細資訊日誌
INFO:這是一個info日誌的級別,是一個確認事情按預期工作的日誌
WARNING:這是一個warning的日誌級別,是一個警告的日誌
ERROR:這是一個error的日誌級別,是一個錯誤的日誌
CRITICAL:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌
4、如何修改日誌時間的格式?
logging.basicConfig(format="%(asctime)a:%(message)s",level="DEBUG")
>>>
2018-11-11 23:05:39,642:這是一個debug日誌的級別,是一個詳細資訊日誌
2018-11-11 23:05:39,642:這是一個info日誌的級別,是一個確認事情按預期工作的日誌
2018-11-11 23:05:39,642:這是一個warning的日誌級別,是一個警告的日誌
2018-11-11 23:05:39,643:這是一個error的日誌級別,是一個錯誤的日誌
2018-11-11 23:05:39,643:這是一個critical日誌級別,是一個非常嚴重錯誤的日誌
5、來點稍微複雜的格式?
提到複雜的格式,應該是在logging.baicConfig()括號裡面加點其他的東西就可以瞭如下:
logging.basicConfig(format='%(lineno)d - %(filename)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s',level="DEBUG")
logging.debug("這是一個debug日誌的級別,是一個詳細資訊日誌")
logging.info("這是一個info日誌的級別,是一個確認事情按預期工作的日誌")
logging.warning("這是一個warning的日誌級別,是一個警告的日誌")
logging.error("這是一個error的日誌級別,是一個錯誤的日誌")
logging.critical("這是一個critical日誌級別,是一個非常嚴重錯誤的日誌")
>>>
13 - loglog.py - 2018-11-11 23:15:54,000 - root - DEBUG - 這是一個debug日誌的級別,是一個詳細資訊日誌
14 - loglog.py - 2018-11-11 23:15:54,001 - root - INFO - 這是一個info日誌的級別,是一個確認事情按預期工作的日誌
15 - loglog.py - 2018-11-11 23:15:54,001 - root - WARNING - 這是一個warning的日誌級別,是一個警告的日誌
16 - loglog.py - 2018-11-11 23:15:54,001 - root - ERROR - 這是一個error的日誌級別,是一個錯誤的日誌
17 - loglog.py - 2018-11-11 23:15:54,001 - root - CRITICAL - 這是一個critical日誌級別,是一個非常嚴重錯誤的日誌
這時候輸出的就有點專業了,解釋如下:
- lineno:輸出日誌的行數
- filename:輸出當前日誌檔案的名稱
- asctime:輸出當前的一個時間
- name: 輸出當前使用者名稱稱
- levelname:輸出當前的日誌級別
- message:輸出當前日誌的內容
6、如何在工程中使用如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
def yankerp(logger_name="YANKAI-LOG", log_file="yankai.log",level=logging.DEBUG):
# 建立logger物件
logger = logging.getLogger(logger_name)
logger.setLevel(level)
# 建立控制檯
ch = logging.StreamHandler()
ch.setLevel(level)
# 建立檔案
fh = logging.FileHandler(filename=log_file, encoding="utf-8")
# create formatter
formatter = logging.Formatter('%(asctime)s - %(filename)s - %(name)s - [line:%(lineno)d]- %(levelname)s - %(message)s')
# 新增 formatter
ch.setFormatter(formatter)
fh.setFormatter(formatter)
logger.addHandler(ch)
logger.addHandler(fh)
return logger
首先定義了一個函式yankerp 定義了logger_name log_file level引數。
1、首先建立logger物件,其實在這裡logger只是一個變數而已,把logging.getLogger類例項化成一個logger物件
2、使用logger物件的其中的方法setLevel設定日誌等級:(level)這裡就是DEBUG
3、建立控制檯,使用logging.StreamHandler() 方法,例項化生成物件ch
4、用過ch物件裡面的setLevl方法來設定日誌等級
5、建立檔案,使用logging裡面方法,FileHandler定義了file_name也就是yankai.log檔名稱及 encoding:編碼格式.
6、建立formatter定義了日誌的輸出格式例項化到formatter物件。
最後新增formatter 控制檯/建立檔案把formatter輸出格式的物件新增到控制檯/檔案,最後使用剛開始例項化的logger物件把檔案,控制檯新增進入,最後返回logger物件。
如何使用如下: