python selenium2示例 - 日誌管理

 


logger繼承圖

前言

      在自動化測試實踐過程當中,必不可少的就是進行日誌管理,方便調試和生產問題追蹤,python提供了logging模塊來進行日誌的管理。下面咱們就logging模塊的學習和使用進行一個層層推動演示學習。java

     Python的logging模塊提供了通用的日誌系統,能夠方便第三方模塊或應用使用。這個模塊提供了不一樣的日誌級別,並能夠採用不一樣的方式進行日誌記錄,好比文件,HTTP GET/POST, SMTP, socket等等,甚至能夠自定實現具體的日誌記錄方式。python

   logging模塊與java的log4j的機制是同樣的,只是具體的語言實現細節有些不一樣。python logging模塊提供了logger、handler、filter、formatter等基礎類。編程

一、logger: 提供日誌接口,供應用程序調用。logger最經常使用的操做有兩大類:配置和發送日誌消息。socket

二、handler:將日誌記錄發送到合適的目的,好比文件、socket等等。一個logger對象能夠經過addhandler方法添加0到N個handler,每一個hangdler又能夠定義不一樣的日誌級別,以實現日誌分級過濾。函數

三、filter:提供了一種優雅的方式決定一個日誌記錄是否發送到handler。學習

四、formatter:指定日誌記錄的輸出格式。formatter的構造方法須要兩個參數:消息的格式字符串和日期字符串,這兩個參數是可選的。測試

默認狀況下,logging將日誌輸出至console,日誌級別爲WARNING。線程

logging中按日誌級別大小關係爲CRITICAL > ERROR > WARNING > INFO >DEBUG > NOTSET,固然也能夠自定義日誌級別。debug

簡單日誌

下面咱們看一下一個簡單的日誌示例,將日誌記錄輸出到console:調試

#-*- coding:utf-8 -*-

import logging

if __name__ == '__main__':

   logging.debug(u'這是bug級別日誌記錄')

   logging.info(u'這是提示信息級別日誌記錄')

   logging.warning(u'這是警告級別日誌記錄')


在console中將輸出一下信息:

WARNING:root:這是警告級別日誌記錄


爲何只輸出了一條呢?由於logging默認狀況下的日誌輸出級別是:WANRING

日誌格式和級別控制

接下來咱們看看如何控制日誌的輸出格式和日誌級別。代碼示例以下:

#-*- coding:utf-8 -*-

import logging

if __name__ == '__main__':

   logging.basicConfig(level=logging.DEBUG,  # 日誌級別設置
       format="%(asctime)s  %(filename)s [line: %(lineno)d] %(levelname)s %(message)s",
       datefmt='%a, %d %b %Y %H:%M:%S',
       filename='mylog.log',
       filemode='w'
   )
   logging.debug(u'這是debug級別日誌記錄')
   logging.info(u'這是信息級別日誌記錄')
   logging.warning(u'這是警告級別日誌記錄')
   

在當前目錄下mylog.log文件中的內容爲:
Mon, 20 Mar 2017 16:21:28 log.py [line: 14] DEBUG 這是debug級別日誌記錄
Mon, 20 Mar 2017 16:21:28 log.py [line: 15] INFO 這是信息級別日誌記錄
Mon, 20 Mar 2017 16:21:28 log.py [line: 16] WARNING 這是警告級別日誌記錄

logging.basicConfig函數各參數說明

filename: 指定日誌輸出文件名

filemode:和file函數的意義相同,指定日誌文件的打開模式,‘w或a’

format:指定日誌輸出格式和內容,format能夠輸出不少有用的信息,如上例所示:

   %(levelno)s: 打印日誌級別的數值

   %(levelname)s: 打印日誌級別名稱

   %(pathname)s: 打印當前執行程序的路徑,其實就是sys.argv[0]

   %(filename)s: 打印當前執行程序名

   %(funcName)s: 打印日誌的當前函數

   %(lineno)d: 打印日誌的當前行號

   %(asctime)s: 打印日誌的時間

   %(thread)d: 打印線程ID

   %(threadName)s: 打印線程名稱

   %(process)d: 打印進程ID

   %(message)s: 打印日誌信息

datefmt:指定時間格式,同time.strtime()

level:指定日誌級別,默認爲logging.WARNING

stream:指定日誌的輸出流,能夠指定輸出到sys.stderr, sys.stdout或文件,默認輸出到sys.stderr,當stream和filename同時指定時,stream被忽略。

日誌輸入定向

下面咱們來看看如何把日誌同時輸出到console和文件中,代碼示例以下:

#-*- coding:utf-8 -*-

import logging

if __name__ == '__main__':

   logging.basicConfig(level=logging.DEBUG,  # 日誌級別設置

       format="%(asctime)s  %(filename)s [line: %(lineno)d] %(levelname)s %(message)s",

       datefmt='%a, %d %b %Y %H:%M:%S',

       filename='mylog.log',

       filemode='w')

   #####################################################
   # 定義一個StreamHandler,將info級別的或更高級別的日誌輸出到標錯錯誤
   # 並將其添加到當前的日誌處理對象
   console = logging.StreamHandler()
   console.setLevel(logging.INFO)
   formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
   console.setFormatter(formatter)
   logging.getLogger('').addHandler(console)
   ####################################################
   logging.debug(u"這是debug日誌記錄")
   logging.info(u'這是info日誌記錄')
   logging.warning(u'這是warning日誌記錄')

在console中輸出如下日誌記錄:
root        : INFO     這是info日誌記錄
root        : WARNING  這是warning日誌記錄

在當前目錄下mylog.log文件中內容爲:
Mon, 20 Mar 2017 17:32:43  log.py [line: 26] DEBUG 這是debug日誌記錄
Mon, 20 Mar 2017 17:32:43  log.py [line: 27] INFO 這是info日誌記錄
Mon, 20 Mar 2017 17:32:43  log.py [line: 28] WARNING 這是warning日誌記錄

在本示例中實現了根據不一樣須要,將不一樣級別的日誌重定向輸出至不一樣的目標。

日誌配置

在上述全部的示例中,日誌的配置都是在代碼中實現,但在實際的應用過程當中,咱們通常都須要動態的配置日誌信息,或是知足自定義的須要,下面咱們就自定義日誌配置進行示例演示:

# 定義一個配置文件,這裏命名爲logger.conf,爲標準的INI格式的文件,內容以下

###############################################

###### 下面定義了三個logger: root,demo01,demo01

[loggers]

keys=root,demo01,demo01

[logger_root]

level=DEBUG

handlers=hand01,hand02

[logger_demo01]

handlers=hand01,hand02

qualname=demo01

propagate=0

[logger_demo02]

handlers=hand01,hand03

qualname=demo02

propagate=0

###############################################

#### 下面定義了三個handler: hand01,hand02,hand03

[handlers]

keys=hand01,hand02,hand03

[handler_hand01]

class=StreamHandler

level=INFO

formatter=form02

args=(sys.stderr,)

[handler_hand02]

class=FileHandler

level=DEBUG

formatter=form01

args=('mylog.log', 'a')

[handler_hand03]

class=handlers.RotatingFileHandler

level=INFO

formatter=form02

args=('mylog.log', 'a', 10*1024*1024, 5)

###############################################

### 下面定義了兩種formatter: form01,form02

[formatters]

keys=form01,form02

[formatter_form01]

format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

datefmt=%a, %d %b %Y %H:%M:%S

[formatter_form02]

format=%(name)-12s: %(levelname)-8s %(message)s

datefmt=

使用demo01 logger代碼示例:

#-*- coding:utf-8 -*-

import logging

import logging.config

if __name__ == '__main__':

   logging.config.fileConfig("logger.conf")

   logger = logging.getLogger("demo01")

   logger.debug(u'這是demo01 debug日誌記錄')

   logger.info('u'這是demo01 info日誌記錄')

  logger.warning(u'這是demo01 warning日誌記錄')

下面是使用demo02 logger代碼示例:

#-*- coding:utf-8 -*-

import logging

import logging.config

if __name__ == '__main__':

   logging.config.fileConfig("logger.conf")

   logger = logging.getLogger("demo02")

   logger.debug(u'這是demo02 debug日誌記錄')

   logger.info('u'這是demo02 info日誌記錄')

   logger.warning(u'這是demo02 warning日誌記錄')

結束語

本文從日誌的基本應用到更高級的應用方式層層推動進行演示,固然了在實際的自動化測試實踐中,還須要對logging模塊進行更高級的封裝以提升其複用性,達成高可用的目的。對於測試人員而言更須要增強編程基本功,提高測試技術能力,更加靈活的應用各類基礎技術。

相關文章
相關標籤/搜索