python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类
一、 问题分析:
我们需要封装一个简单的日志类,主要有以下内容:
1. 生成的日志文件格式是 年月日时分秒.log
2. 生成的xxx.log文件存储在项目Logs文件夹下
3. 这个日志类,支持INFO,ERROR两种日志级别
4. 日志里,每行日志输出,时间日期+执行类名称+日志级别+日志描述
二、解决问题思路:
1. 在根目录下新建一个Logs的文件夹,如何获取这个Log的相对路径。
2. 日志的保存命名,需要系统时间,前面也介绍过时间格式化输出
3. Python中有一个logging模块来支持我们自定义封装一个新日志类。
4. 在脚本里,初始化一个日志类的实例对象,然后去控制输出INFO还是ERROR日志信息。
三、logger.py文件代码如下所示
#coding:utf-8
import os
import logging
import time
class Logger(object):
def __init__(self,logger):
#创建一个logger
self.logger=logging.getLogger(logger)#进行初始化
self.logger.setLevel(logging.DEBUG)#日志等级为debug
#创建一个handler,用于写入日志文件
tm=time.strftime('%Y%m%d%H%M',time.localtime()) #格式化时间,按照 201712211152 打印
log_path=os.path.dirname(os.path.abspath('.'))+'/pro1/Logs/'
log_name = log_path + tm + '.log'
fh=logging.FileHandler(log_name)
fh.setLevel(logging.INFO)
#再创建一个handler,用于输出到控制台
ch=logging.StreamHandler()
ch.setLevel(logging.INFO)
#定义handler的输出格式
formatter=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#给logger添加handler
self.logger.addHandler(fh)
self.logger.addHandler(ch)
def getLog(self):
return self.logger
四、logging模块的API
1. logging.getLogger([name])
返回一个logger实例,如果没有指定name,返回root logger。
只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是
一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到
同一个logger实例
2. Logger.setLevel(lvl)
设置logger的level, level有以下几个级别:
NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出
3. Logger.addHandler(hdlr)
logger可以雇佣handler来帮它处理日志, handler主要有以下几种:
StreamHandler: 输出到控制台
FileHandler: 输出到文件
handler还可以设置自己的level以及输出格式。
五、测试代码
1.测试脚本如下所示,文件名为test_log.py
#coding:utf-8
from pro1.logger import Logger
from selenium import webdriver
import time
mylogger=Logger(logger='TestLog').getLog()
class TestLog(object):
def printLog(self):
driver=webdriver.Firefox()
mylogger.info("打开浏览器")
driver.maximize_window()
mylogger.info("窗口最大化")
driver.implicitly_wait(8)
driver.get("https://www.baidu.com/")
mylogger.info("打开百度首页")
time.sleep(2)
mylogger.info("暂停2秒")
driver.quit()
mylogger.info("关闭并退出浏览器")
test=TestLog()
test.printLog()
详情参考:http://blog.csdn.net/u011541946/article/details/70198676
python+selenium之自定义封装一个简单的Log类的更多相关文章
- Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》
Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676
- Python之自定义封装一个简单的Log类
参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...
- VC++ 一个简单的Log类
在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...
- Directx11学习笔记【四】 封装一个简单的Dx11DemoBase
根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBas ...
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...
- 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件
先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...
- 代码改变世界 | 如何封装一个简单的 Koa
下面给大家带来:封装一个简单的 Koa Koa 是基于 Node.js 平台的下一代 web 开发框架 Koa 是一个新的 web 框架,可以快速而愉快地编写服务端应用程序,本文将跟大家一起学习:封装 ...
- C++定义一个简单的Computer类
/*定义一个简单的Computer类 有数据成员芯片(cpu).内存(ram).光驱(cdrom)等等, 有两个公有成员函数run.stop.cpu为CPU类的一个对象, ram为RAM类的一个对象, ...
- C 封装一个简单二叉树基库
引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而 没有遭受到冷 ...
随机推荐
- gdb调试运行程序带参数(调用动态链接库),debug过程记录
library多线程file1.gdb (运行程序名称) 例如 gdb cbenchmark 2.设置运行参数 set args -c 1 -n 1 -F ./libaliww.so -l 1 3.如 ...
- 转:TCP/IP协议选项——TCP_KEEPALIVE .
[+] KEEPALIVE作用 KEEPALIVE代码示例 KEEPALIVE脚本设置 1.KEEPALIVE作用 KEEPALIVE机制,是TCP协议规定的TCP层(非应用层业务代码实现的)检测 ...
- 【laravel54】报错:No supported encrypter found (加密类未找到)
原因:配置环境未生产 key 密钥,直接cmd,进入项目根目录,执行:php artisan key:generate 即可
- 【laravel54】win系下本地域名配置(解决403错误)
1.apache虚拟目录地址应该指向\laravel54\public 目录下:(TP5类似) <VirtualHost *:> DocumentRoot "D:\phpStud ...
- JavaScript常用語句
1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是: document->html->(head,body)4 ...
- webqq协议分析之~~~~登陆
最近好几个新项目积一起了,比较忙,所以博客迟迟未更新,还请各位见谅!下面来继续分析webqq协议,本章将说明如何实现登陆 1:输入QQ号和密码登陆,检测HTTP请求url如下,这是第一次登陆 http ...
- python --批量重命名文件名
# -*- coding: utf-8 -*- import os path = "d:\\curl\data\\" for file in os.listdir(path): p ...
- Provisional headers are shown(一)
谷歌浏览器调试的时候,这个警告经常出现.但是每次产生的原因可能都是不一样的. 这篇文档记录我遇到的其中一次. 现象:一个并发的错误信息: CAUTION:request is not finished ...
- mysql create table 语法详解
create table 可以分成三类 一.一般create table 语句: 1 语法 create [temporary] table [if not exists] tbl_name (cre ...
- Atitit. 解释器模式框架选型 and应用场景attilax总结 oao
Atitit. 解释器模式框架选型 and应用场景attilax总结 oao 1. 解释器模式结构描述 1 2. 如何实现(简单的解释器模式,仅仅通过词法分析即可实现,而无需token流进行处理. 2 ...