1. 程式人生 > >Python模塊:logging、

Python模塊:logging、

logging onf () roo 指定 綁定 out tde password

logging模塊:

很多程序都有記錄日誌的需求,並且日誌中包含的信息既有正常的程序訪問日誌,還可能有錯誤、警告等信息輸出。Python的logging模塊提供了標準的日誌接口,你可以通過它存儲各種格式的日誌。logging的日誌可以分為debug()、info()、warning()、error() and critical()5個級別(按順序,級別越來越高)。

最簡單的用法:

import logging
logging.warning(User [neo] attempted wrong password more than 3 times)
logging.critical(
server is down) # 運行結果: # 跟print沒啥區別 # WARNING:root:User [neo] attempted wrong password more than 3 times # CRITICAL:root:server is down

日誌級別:

技術分享圖片

把日誌寫到文件裏:

import logging
logging.basicConfig(filename=logging_test.log,level=logging.INFO)  #  Do basic configuration for the logging system.   #  level=logging.INFO的意思是:只有日誌是INFO或者比INFO級別更高的日誌才會被記錄在文件裏 #  記錄日誌時,只會接著以前的日誌繼續記錄,不會把以前的記錄覆蓋掉。
logging.debug(debug test) logging.info(INFO info) logging.warning(Warning!) # 運行結果: 把logging.info和logging.warning記錄在了 ‘logging_test.log’(.log的後綴名)這個文件裏。 # 這種情況下屏幕上沒打印,即 沒有輸出到屏幕 # 如下所示: # INFO:root:INFO info # WARNING:root:Warning!

把時間加到日誌裏面:

import logging
logging.basicConfig(filename
=logging_with_time.log, level=logging.INFO, format=%(asctime)s %(message)s, datefmt=%Y-%m-%d %H:%M:%S) # 註意裏面的參數‘format’和‘datefmt’ logging.debug(debug test) logging.info(INFO info) logging.warning(Warning!) # 運行結果: INFO及其以上級別寫入了‘logging_with_time.log’文件裏面 # 如下所示: # 2018-02-09 11:37:11 INFO info # 2018-02-09 11:37:11 Warning!

除了加時間,還可以自定義其他的格式,下表就是所有支持的格式:

技術分享圖片

logging進階:日誌同時輸出到屏幕和文件:

Python使用logging模塊記錄日誌涉及四個主要的類:

  • logger提供了應用程序可以直接使用的接口
  • handler將(logger創建的)日誌記錄發送到合適的目的輸出
  • filter提供了細度設備來決定輸出哪條日誌記錄
  • formatter決定日誌記錄的最終輸出格式

它們之間的關系如下:

技術分享圖片

logger:

每個程序在輸出信息之前都要先獲得一個logger,如:

import logging

# 生成 logger 對象
logger = logging.getLogger(web)   # logger通常對應了程序的模塊名

# 對logger對象設置Level級別,如設置成INFO級別 
logger.setLevel(logging.INFO)   #  利用logger.setLevel()對生成的logger對象設置級別, logging.INFO是把級別具體設置成INFO,如果你不設置,系統會默認把Level設置成WARNING。 #  對logger對象設置level的作用: logger。setLevel()相當於一個全局變量,所需要輸出的日誌需要先經過logging.getLogger生成logger對象,所以生成logger對象之前,會先檢測所輸出的日誌級別是否符合logger.setLevel的級別,如果符合則生成logger對象;如果不符合則直接忽略、不生成logger對象。 舉例說明: 有兩個需要輸出的日誌: logger.debug(‘test debug‘) 和 logger.info(‘test info‘) , 執行這兩句代碼的時候, 由於我已經給生成logger設置了level --- INFO:logger.setLevel(logging.INFO) ,debug的level低於INFO, 所以 logger.debug(‘test debug‘) 不會生成logger對象,但 logger.info(‘test info‘) 則會生成logger對象(相當於第一步生成logger對象時過濾了一部分數據)

handler:

handler負責發送相關的信息到指定目的地。 Python日誌系統有多種handler可以使用。可以把信息輸出到控制臺(屏幕),也可以把信息輸出到文件,把信息發送到網絡上。自己也可以編寫自己的handler。

每個logger可以附加多個handler。常用的handler如下:

  1. logging.StreamHandler # 使用這個handler可以向類似於sys.stdout 或者 sys.stderr 的任何文件對象(file object)輸出信息(往屏幕上輸出)
  2. logging.FileHandler 和 StreamHandler類似, 用於向一個文件輸出日誌信息,不過FileHandler會幫你打開這個文件(往文件中輸出)
  3. 還有兩種用法:一是根據文件大小截斷;二是根據時間interval截斷。 詳情參考: https://www.luffycity.com/python-book/di-4-zhang-python-ji-chu-2014-chang-yong-mo-kuai/logging-mo-kuai.html

用法如下:

#  生成logger對象之後,再生成handler對象,然後把handler綁定到logger上

# 生成handler對象
ch = logging.StreamHandler()   # 負責往屏幕發送的handler(發送到屏幕,所以括號裏面為空)
fh = logging.FileHandler(web.log)   #  負責往文件“web.log”發送的handler   #  日誌文件的後綴名: .log

#  把生成的handler對象綁定到logger對象
logger.addHandler(ch)   #  把ch這個handler對象綁定到logger上
logger.addHandler(fh)   #  把fh這個handler對象綁定到logger上

#  設置handler的level
ch.setLevel(logging.INFO)   #  把ch這個handler對象的level設置成INFO
fh.setLevel(logging.WARNING)   # 把fh這個handler對象的level設置成WARNING

#  關於設置handler的level,道理跟logger的level設置類似,即: 如果你不設置, 程序會默認level是WARNING;通過這一步設置的level能夠再次“過濾”數據
# 關於logger設置的level和handler設置的level,按照哪個level呢? 效果上可以這麽理解: 所需要輸出的日誌(如: logger.warning(xx)), 先經過logger設置的level“過濾”,然後在生成handler對象這一步, 再次經過這一步的level“過濾”:level符合,則生成相應的handler;level不符合則忽略、不生成handler對象。   

formatter組件:

日誌的formatter是個獨立的組件,可以跟handler組合, 用於設置所要發送的信息以什麽樣的格式發送到目的地。

用法:

#  生成handler對象之後,再生成formatter對象,然後將formatter對象和handler綁定

# 生成formatter對象
console_fmt = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(message)s)  #  利用上面的logger名字表
file_fmt = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)

#  把formatter對象綁定到handler
ch.setFormatter(console_fmt)
fh.setFormatter(file_fmt)      

下面把上述的代碼拼接到一起看效果:

import logging

# 生成logger對象
logger = logging.getLogger(web)
logger.setLevel(logging.INFO)

# 生成handler對象
ch = logging.StreamHandler()
fh = logging.FileHandler(web.log)
# 設置level
ch.setLevel(logging.DEBUG)
fh.setLevel(logging.WARNING)
# 把handler綁定在logger上
logger.addHandler(ch)
logger.addHandler(fh)

# 生成formatter對象
console_fmt = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(message)s)
file_fmt = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)  #  %(name)s  這個name就是生成logger時括號裏面的‘web’
# 把formatter綁定到handler
ch.setFormatter(console_fmt)
fh.setFormatter(file_fmt)

logger.debug(debug test)
logger.info(info test)
logger.warning(warning test)
logger.error(error test)
logger.critical(critical test)   # 輸出的日誌

filter的用法參考: https://www.luffycity.com/python-book/di-4-zhang-python-ji-chu-2014-chang-yong-mo-kuai/logging-mo-kuai.html

Python模塊:logging、