python selenium2示例 - 日志管理


logger继承图

前言

      在自动化测试实践过程中,必不可少的就是进行日志管理,方便调试和生产问题追踪,python提供了logging模块来进行日志的管理。下面我们就logging模块的学习和使用进行一个层层推进演示学习。

     Python的logging模块提供了通用的日志系统,可以方便第三方模块或应用使用。这个模块提供了不同的日志级别,并可以采用不同的方式进行日志记录,比如文件,HTTP GET/POST, SMTP, socket等等,甚至可以自定实现具体的日志记录方式。

   logging模块与java的log4j的机制是一样的,只是具体的语言实现细节有些不同。python logging模块提供了logger、handler、filter、formatter等基础类。

1、logger: 提供日志接口,供应用程序调用。logger最常用的操作有两大类:配置和发送日志消息。

2、handler:将日志记录发送到合适的目的,比如文件、socket等等。一个logger对象可以通过addhandler方法添加0到N个handler,每个hangdler又可以定义不同的日志级别,以实现日志分级过滤。

3、filter:提供了一种优雅的方式决定一个日志记录是否发送到handler。

4、formatter:指定日志记录的输出格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数是可选的。

默认情况下,logging将日志输出至console,日志级别为WARNING。

logging中按日志级别大小关系为CRITICAL > ERROR > WARNING > INFO >DEBUG > NOTSET,当然也可以自定义日志级别。

简单日志

下面我们看一下一个简单的日志示例,将日志记录输出到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模块进行更高级的封装以提高其复用性,达成高可用的目的。对于测试人员而言更需要加强编程基本功,提升测试技术能力,更加灵活的应用各种基础技术。

获取授权

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容