python自動化測試學習筆記-9python的日志模塊


參考

 

logging模塊,用來處理python中的日志;

import logging

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')

執行查看結果:

可見,默認情況下python的logging模塊將日志打印到了標准輸出中,且只顯示了大於等於WARNING級別的日志,這說明默認的日志級別設置為WARNING(日志級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET),默認的日志格式為日志級別:Logger名稱:用戶輸出消息。

import logging

logging.basicConfig(level=logging.DEBUG,filename='2018log.log',filemode='a',format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
logging.debug('我的debug信息')
logging.info('我的info信息')
logging.warning('我的warning信息')
logging.error('我的error信息')
logging.critical('我的critical信息')

執行查看結果:生成了2018log.log文件

logging.basicConfig()函數中可通過具體參數來更改logging模塊默認行為,可用參數有
filename:用指定的文件名創建FiledHandler(后邊會具體講解handler的概念),這樣日志會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
format:指定handler使用的日志顯示格式。
datefmt:指定日期時間格式。
level:設置rootlogger的日志級別
stream:用指定的stream創建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件,默認為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。


import logging
import sys

logging.basicConfig(level=logging.DEBUG,stream=sys.stderr,filemode='a',format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
logging.debug('我的debug信息')
logging.info('我的info信息')
logging.warning('我的warning信息')
logging.error('我的error信息')
logging.critical('我的critical信息')

執行查看結果:

logging庫提供了多個組件:Logger、Handler、Filter、Formatter。

  • Loggers 暴露了應用程序代碼可以直接使用的接口
  • Handlers 發送日志記錄(由 loggers 創建)到合適的目的地
  • Filters 提供了細粒度的方法來決定哪些日志記錄需要被輸出
  • Formatters 指定了在最終輸出時,日志記錄的布局格式

 

Logger
Logger是一個樹形層級結構,輸出信息之前都要獲得一個Logger(如果沒有顯示的獲取則自動創建並使用root Logger,如第一個例子所示)。
logger = logging.getLogger()返回一個默認的Logger也即root Logger,並應用默認的日志級別、Handler和Formatter設置。
當然也可以通過Logger.setLevel(lel)指定最低的日志級別,可用的日志級別有logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL。
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()輸出不同級別的日志,只有日志等級大於或等於設置的日志級別的日志才會被輸出。

定義:logger = logging.getLogger(__name__)

Handler

Handler對象負責發送相關的信息到指定目的地,有幾個常用的Handler方法:
Handler.setLevel(lel):指定日志級別,低於lel級別的日志將被忽略
Handler.setFormatter():給這個handler選擇一個Formatter
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter對象

可以通過addHandler()方法為Logger添加多個Handler:

 

有多種可用的Handler:

logging.StreamHandler 可以向類似與sys.stdout或者sys.stderr的任何文件對象(file object)輸出信息
logging.FileHandler 用於向一個文件輸出日志信息
logging.handlers.RotatingFileHandler 類似於上面的FileHandler,但是它可以管理文件大小。當文件達到一定大小之后,它會自動將當前日志文件改名,然后創建一個新的同名日志文件繼續輸出
logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler類似,不過,它沒有通過判斷文件大小來決定何時重新創建日志文件,而是間隔一定時間就自動創建新的日志文件
logging.handlers.SocketHandler 使用TCP協議,將日志信息發送到網絡。
logging.handlers.DatagramHandler 使用UDP協議,將日志信息發送到網絡。
logging.handlers.SysLogHandler 日志輸出到syslog
logging.handlers.NTEventLogHandler 遠程輸出日志到Windows NT/2000/XP的事件日志 
logging.handlers.SMTPHandler 遠程輸出日志到郵件地址
logging.handlers.MemoryHandler 日志輸出到內存中的制定buffer
logging.handlers.HTTPHandler 通過"GET"或"POST"遠程輸出到HTTP服務器
各個Handler的具體用法可查看參考書冊:
https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers

Formatter
Formatter對象設置日志信息最后的規則、結構和內容,默認的時間格式為%Y-%m-%d %H:%M:%S。

Filter
限制只有滿足過濾規則的日志才會輸出。
比如我們定義了filter = logging.Filter('a.b.c'),並將這個Filter添加到了一個Handler上,則使用該Handler的Logger中只有名字帶a.b.c前綴的Logger才能輸出其日志。

    1. filter = logging.Filter('a.b.c')  
    2. fh.addFilter(filter)
    3. logger.addFilter(filter)

多模塊使用logging
logging模塊保證在同一個python解釋器內,多次調用logging.getLogger('log_name')都會返回同一個logger實例,即使是在多個模塊的情況下。所以典型的多模塊場景下使用logging的方式是在main模塊中配置logging,這個配置會作用於多個的子模塊,然后在其他模塊中直接通過getLogger獲取Logger對象即可。

示例:
import logging
from logging import handlers
#獲取logger
logger=logging.getLogger('TestLog')
#設置logger級別
logger.setLevel(logging.INFO)
#設置logger格式
format_str=logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
#輸出到控制台
st=logging.StreamHandler()
st.setFormatter(format_str)
#輸出到文件
th=handlers.TimedRotatingFileHandler('Testlog.log',when='h',interval=2,encoding='utf-8')
th.setFormatter(format_str)
#添加到handler
logger.addHandler(st)
logger.addHandler(th)

logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

 

執行查看結果:

查看生成的日志文件:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM