python selenium2示例 - 日志管理


logger繼承圖

前言

? ? ? 在自動化測試實踐過程中糯而,必不可少的就是進行日志管理天通,方便調(diào)試和生產(chǎn)問題追蹤,python提供了logging模塊來進行日志的管理熄驼。下面我們就logging模塊的學(xué)習(xí)和使用進行一個層層推進演示學(xué)習(xí)像寒。

? ? ?Python的logging模塊提供了通用的日志系統(tǒng),可以方便第三方模塊或應(yīng)用使用瓜贾。這個模塊提供了不同的日志級別诺祸,并可以采用不同的方式進行日志記錄,比如文件祭芦,HTTP GET/POST筷笨, SMTP, socket等等,甚至可以自定實現(xiàn)具體的日志記錄方式奥秆。

? ?logging模塊與java的log4j的機制是一樣的逊彭,只是具體的語言實現(xiàn)細節(jié)有些不同。python logging模塊提供了logger构订、handler侮叮、filter、formatter等基礎(chǔ)類悼瘾。

1囊榜、logger: 提供日志接口,供應(yīng)用程序調(diào)用亥宿。logger最常用的操作有兩大類:配置和發(fā)送日志消息卸勺。

2、handler:將日志記錄發(fā)送到合適的目的烫扼,比如文件曙求、socket等等。一個logger對象可以通過addhandler方法添加0到N個handler映企,每個hangdler又可以定義不同的日志級別悟狱,以實現(xiàn)日志分級過濾。

3堰氓、filter:提供了一種優(yōu)雅的方式?jīng)Q定一個日志記錄是否發(fā)送到handler挤渐。

4、formatter:指定日志記錄的輸出格式双絮。formatter的構(gòu)造方法需要兩個參數(shù):消息的格式字符串和日期字符串浴麻,這兩個參數(shù)是可選的。

默認情況下囤攀,logging將日志輸出至console软免,日志級別為WARNING。

logging中按日志級別大小關(guān)系為CRITICAL > ERROR > WARNING > INFO >DEBUG > NOTSET抚岗,當(dāng)然也可以自定義日志級別或杠。

簡單日志

下面我們看一下一個簡單的日志示例,將日志記錄輸出到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, ?# 日志級別設(shè)置
? ? ? ?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'這是警告級別日志記錄')
? ?

在當(dāng)前目錄下mylog.log文件中的內(nèi)容為:
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函數(shù)各參數(shù)說明

filename: 指定日志輸出文件名

filemode:和file函數(shù)的意義相同,指定日志文件的打開模式胚委,‘w或a’

format:指定日志輸出格式和內(nèi)容挟鸠,format可以輸出很多有用的信息,如上例所示:

? ?%(levelno)s: 打印日志級別的數(shù)值

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

? ?%(pathname)s: 打印當(dāng)前執(zhí)行程序的路徑亩冬,其實就是sys.argv[0]

? ?%(filename)s: 打印當(dāng)前執(zhí)行程序名

? ?%(funcName)s: 打印日志的當(dāng)前函數(shù)

? ?%(lineno)d: 打印日志的當(dāng)前行號

? ?%(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佳遂,當(dāng)stream和filename同時指定時,stream被忽略撒顿。

日志輸入定向

下面我們來看看如何把日志同時輸出到console和文件中丑罪,代碼示例如下:

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

import logging

if __name__ == '__main__':

? ?logging.basicConfig(level=logging.DEBUG, ?# 日志級別設(shè)置

? ? ? ?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級別的或更高級別的日志輸出到標(biāo)錯錯誤
? ?# 并將其添加到當(dāng)前的日志處理對象
? ?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日志記錄

在當(dāng)前目錄下mylog.log文件中內(nèi)容為:
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日志記錄

在本示例中實現(xiàn)了根據(jù)不同需要凤壁,將不同級別的日志重定向輸出至不同的目標(biāo)吩屹。

日志配置

在上述所有的示例中,日志的配置都是在代碼中實現(xiàn)拧抖,但在實際的應(yīng)用過程中煤搜,我們一般都需要動態(tài)的配置日志信息,或是滿足自定義的需要唧席,下面我們就自定義日志配置進行示例演示:

# 定義一個配置文件擦盾,這里命名為logger.conf,為標(biāo)準(zhǔn)的INI格式的文件淌哟,內(nèi)容如下

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

###### 下面定義了三個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日志記錄')

結(jié)束語

本文從日志的基本應(yīng)用到更高級的應(yīng)用方式層層推進進行演示厌衙,當(dāng)然了在實際的自動化測試實踐中,還需要對logging模塊進行更高級的封裝以提高其復(fù)用性绞绒,達成高可用的目的。對于測試人員而言更需要加強編程基本功榕暇,提升測試技術(shù)能力蓬衡,更加靈活的應(yīng)用各種基礎(chǔ)技術(shù)。

獲取授權(quán)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彤枢,一起剝皮案震驚了整個濱河市狰晚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缴啡,老刑警劉巖壁晒,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異业栅,居然都是意外死亡秒咐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門碘裕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來携取,“玉大人,你說我怎么就攤上這事帮孔±鬃蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晤斩。 經(jīng)常有香客問我焕檬,道長,這世上最難降的妖魔是什么澳泵? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任实愚,我火速辦了婚禮,結(jié)果婚禮上烹俗,老公的妹妹穿的比我還像新娘爆侣。我一直安慰自己,他們只是感情好幢妄,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布兔仰。 她就那樣靜靜地躺著,像睡著了一般蕉鸳。 火紅的嫁衣襯著肌膚如雪乎赴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天潮尝,我揣著相機與錄音榕吼,去河邊找鬼。 笑死勉失,一個胖子當(dāng)著我的面吹牛羹蚣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乱凿,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼顽素,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徒蟆?” 一聲冷哼從身側(cè)響起胁出,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎段审,沒想到半個月后全蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡寺枉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年抑淫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姥闪。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡丈冬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甘畅,到底是詐尸還是另有隱情埂蕊,我是刑警寧澤往弓,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蓄氧,受9級特大地震影響函似,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喉童,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一瘾英、第九天 我趴在偏房一處隱蔽的房頂上張望懈贺。 院中可真熱鬧蜻韭,春花似錦左电、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晶框,卻和暖如春排抬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背授段。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工蹲蒲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侵贵。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓届搁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窍育。 傳聞我的和親對象是個殘疾皇子咖祭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容