python的logging模块能很好的帮我们完成程序的日志功能,他的配置其实类似我们用java的log4j配置。下面简单说明下,实际应用中logging配置的使用。
有同学会说,logging这么麻烦,我直接用print就好啦,套用大老师的话,这很low....
进入正题,先什么都不说,上配置logging.conf:
# 文件名 logging.conf
[loggers]
keys=root,myAutoTest
[handlers]
keys=fileHandler,consoleHandler
[formatters]
keys=myFormatter
[logger_root]
level=DEBUG
handlers=fileHandler
[logger_myAutoTest]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=myAutoTest
propagate=0
[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
formatter=myFormatter
encoding=utf-8
[handler_fileHandler]
class=FileHandler
args=('./logs/my_auto_test.log','a','utf-8')
formatter=myFormatter
[formatter_myFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
上面的配置文件中:由[loggers],[handlers],[formaters] 信息组成,keys对应实例化是他们的名称,多个用逗号隔开。
然后再分别配置各个logger,handler,formaters。以logger为例,logger下有root和myAutoTest两个logger,
就要配置[logger_root]和[logger_myAutoTest];类似的,handler和formater也是这样。
在[logger_name] 中的参数purlname ,是设置logging.getLoger(name)中的name值;
propagete参数 :propagete=0,表示输出日志,但消息不传递;propagate=1是输出日志,同时消息往更高级别的地方传递。
若上面配置文件参数progagate=1,myAutoTest的更高级logger有root,输出的结果会是:
2019-03-15 22:48:01 - myAutoTest - DEBUG - debug
2019-03-15 22:48:01 - myAutoTest - DEBUG - debug
2019-03-15 22:48:01 - myAutoTest - INFO - info
2019-03-15 22:48:01 - myAutoTest - INFO - info
2019-03-15 22:48:01 - myAutoTest - WARNING - warning
2019-03-15 22:48:01 - myAutoTest - WARNING - warning
2019-03-15 22:48:01 - myAutoTest - ERROR - error
2019-03-15 22:48:01 - myAutoTest - ERROR - error
2019-03-15 22:48:01 - myAutoTest - CRITICAL - critiacl
2019-03-15 22:48:01 - myAutoTest - CRITICAL - critiacl
像其它的语言那样,python里的logging信息同样也是分为5个等级,分别是:DEBUG,INFO,WARNING,ERROR,CRITICAL
下面是应用说明:
DEBUG:面向功能开发人员,一般在功能开发阶段使用,用来给开发人员检查功能是否正常的。
此类日志只在开发阶段使用,线上系统不开此级别日志。
INFO:内测版可输出此日志,用来查看新开发特性或者 bug fix 是否正常。 一般线上系统不开此级别日志。
WARN:不会对系统造成影响的非正常流程。 线上系统不开此级别日志。
ERROR:会对系统造成影响的非正常流程,可自我修复,不影响系统稳定性。 线上系统不开此级别日志。
CRITICAL:产生了不可逆的错误,系统无法正常工作。线上系统不开此级别日志。
日志虽有千般好,但是切记:日志只可记录系统运行状态,不可输出用户敏感数据。否则就会被祭天。
python中,logging由logger,handler,filter,formater四个部分组成:
logger是提供我们记录日志的方法;
handler是让我们选择日志的输出地方,如:控制台,文件,邮件发送等,一个logger添加多个handler;
filter是给用户提供更加细粒度的控制日志的输出内容;
formater用户格式化输出日志的信息。
logger的级别划分,python中, root是默认的最高级别的,其它的logger的级别通过"."来划分等级,如:father,father.son1,father.son2三个logger,father.son1,father.son2都的级别都低于father,依此类推。
日志文件调用
import logging.config
import logging
import os
def get_logger(name='myAutoTest'):
# 获取配置文件路径
conf_log = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logging.conf")
# 使用getLogger加载配置文件
logging.config.fileConfig(conf_log)
# 获取logger对象
logger = logging.getLogger(name)
return logger
日志应用场景
from selenium.webdriver.common.by import By
class Test():
driver = BrowserEngine.init_local_driver()
logger = logging_setting.get_logger()
def my_test(self):
self.logger.info("目标电脑列表页------出发!!!!!!!!!")
goods_list_page = GoodsListPage(self.driver)
goods_list_page.get_goods_list_driver("电脑","笔记本")
brand_locator = (By.ID, "brand-11518")
price_locator = (By.LINK_TEXT, "7000以上")
commnet_locator = (By.LINK_TEXT, "评论数")
goods_list_page.get_selector_page([brand_locator, price_locator, commnet_locator])
self.logger.info("到达筛选后的页面")
goods = (By.XPATH, "//*[@id=\"plist\"]/ul/li[1]/div/div[1]/a/img")
driver = goods_list_page.get_goods_info_page(goods)
self.logger.info("当前url地址是:" + driver.current_url)
goods_info = GoodsInfoPage(driver)
goods_info.save_product_info()
self.logger.info("保存商品信息成功")
t = Test()
t.my_test()
执行代码后,在指定的路径my_auto_test.log 有日志写入
2019-03-15 22:48:01 - myAutoTest - INFO - 目标电脑列表页------出发!!!!!!!!!
2019-03-15 22:48:10 - myAutoTest - INFO - 到达筛选后的页面
2019-03-15 22:48:12 - myAutoTest - INFO - 当前url地址是:https://item.jd.com/6535936.html
2019-03-15 22:48:15 - myAutoTest - INFO - 保存商品信息成功