测试平台系列(3) 给Hello World添加日志
给Hello World添加日志
回顾
通过上篇内容,我们已经使用「Flask」完成了我们的第一个接口。我们可以看到,使用「Flask」来编写接口是十分简单的。那么接下来,我们丰富一下上面的例子。
需求
现在的需求来了,在我们平时的开发过程中,总会遇到一些问题。但是又不是必现的,所以我们可以通过一些手段来写入日志,去发现问题。一个很明显的例子就是try/exception,遇到未知问题的时候可以将问题记录至日志并在事后排查。
日志模块选用
logging
我们知道,在Python中有系统自带的功能及其强大的logging模块供我们使用,它的强大不多做介绍了。网上的demo很多,稍微copy一个日志类就能使用。
logbook
这里我采用的是github上的「logbook」库,单看api调用的话,比logging方便较多。可能因为我是个喜欢尝鲜的人^_^
安装logbook
在终端输入pip3 install logbook
并回车。
分类
日志模块属于pity的工具类,笔者将之划分到app/utils下。
编写日志类
import logbook
from app import pity
class Log(object):
handler = None
def __init__(self, name='pity', filename=pity.config['LOG_NAME']): # Logger标识默认为app
"""
:param name: 业务名称
:param filename: 文件名称
"""
self.handler = logbook.FileHandler(filename, encoding='utf-8')
self.logger = logbook.Logger(name)
self.handler.push_application()
def info(self, *args, **kwargs):
return self.logger.info(*args, **kwargs)
def error(self, *args, **kwargs):
return self.logger.error(*args, **kwargs)
def warning(self, *args, **kwargs):
return self.logger.warning(*args, **kwargs)
def debug(self, *args, **kwargs):
return self.logger.debug(*args, **kwargs)
在这里,我们定义了一个「Log」类,这个类接受的name是日志的分类,如果不传入则默认为「pity」,filename(日志文件名)默认值为引入config.py中配置的「LOG_NAME」。
然后将logbook中的handler设为写入的文件,并将info/error/warning/debug等常用方法封装在Log类中。
修改run.py
from server.app import app
from server.app.utils.logger import Log
@app.route('/')
def hello_world():
log = Log("hello world专用")
log.info("有人访问你的网站了")
return 'Hello World!'
if __name__ == '__main__':
app.run()
运行run.py
进入浏览器输入http://localhost:5000
发现居然报错了,我们仔细查看下控制台:
看提示是「没有找到对应的文件或目录」, 原来我们的pity目录下没有「logs」目录, 而这种日志库一般也不会帮忙创建目录,所以我们暂时手动在pity目录下建立logs目录即可。
建立以后重启服务, 「再次尝试」。
查看logs/pity.log文件
可以看到,日志文件配置生效,妈妈再也不用担心我意外出错了。
将日志类改为单例模式(选修课)
编辑utils/decorator.py
'''
这是一个装饰器方法文件
'''
class SingletonDecorator:
def __init__(self, cls):
self.cls = cls
self.instance = None
def __call__(self, *args, **kwds):
if self.instance is None:
self.instance = self.cls(*args, **kwds)
return self.instance
如图所示,这是一个单例类的装饰器。首先判断该类的实例是否是None,为None的话则生成新实例,否则返回该实例。这样就确保了只生成一次实例。
当然这只是一个办法,可能在多线程的情况下会出问题。后续的优化和了解,就交给同学们自己了。
给Log类加上装饰器
import logbook
from app import pity
from .decorator import SingletonDecorator
# 注意这里
@SingletonDecorator
class Log(object):
handler = None
def __init__(self, name='pity', filename=pity.config['LOG_NAME']): # Logger标识默认为app
"""
:param name: 业务名称
:param filename: 文件名称
"""
self.handler = logbook.FileHandler(filename, encoding='utf-8')
self.logger = logbook.Logger(name)
self.handler.push_application()
def info(self, *args, **kwargs):
return self.logger.info(*args, **kwargs)
def error(self, *args, **kwargs):
return self.logger.error(*args, **kwargs)
def warning(self, *args, **kwargs):
return self.logger.warning(*args, **kwargs)
def debug(self, *args, **kwargs):
return self.logger.debug(*args, **kwargs)
作业
发现一个小问题,日志的时间似乎不对,可能是哪里出了问题呢?
全部代码地址: https://github.com/wuranxu/pity
「觉得有用的话可以帮忙点个Star哦QAQ」
测试平台系列(3) 给Hello World添加日志的更多相关文章
- 测试平台系列(85) 把redis运用到实战中
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们让支持了前置条件 ...
- 测试平台系列(2) 给Pity添加配置
给Pity添加配置 回顾 还记得上篇文章创立的「Flask」实例吗?我们通过这个实例,给根路由 「/」 绑定了一个方法,从而使得用户访问不同路由的时候可以执行不同的方法. 配置 要知道,在一个「Web ...
- 测试平台系列(71) Python定时任务方案
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 定时任务 定时任务,顾名思义: ...
- 测试平台系列(72) 了解ApScheduler基本用法
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们调研了一下市面上 ...
- 测试平台系列(79) 编写Redis配置功能(下)
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们提出了优化Dao ...
- 测试平台系列(90) 编写oss客户端
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们编写了在线执行测试 ...
- 测试平台系列(92) 让http请求支持文件上传
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节呢,我们编写了oss的 ...
- 测试平台系列(55) 引入AceEditor(代码编辑器)
大家好,我是米洛,求三连!求关注测试开发坑货! 回顾 我们上一节已经写好了左侧数据表目录,今天继续完成sql编辑器的部分. 调研组件 monaco 因为我们的项目用的是React,市面上很多编辑器都是 ...
- 测试平台系列(80) 封装Redis客户端
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了Redis ...
随机推荐
- office响应慢,但电脑速度没问题的解决方案
看了非常多教程都没有用,有点崩,最后终于解决了,记录一下. 问题描述 :office启动没问题,但word打开后,选中一段文字非常慢,大概延迟鼠标移动2-3秒.点击工具栏时也有延迟(点击动画看的十分清 ...
- LVS+Keepalived深度理解,阐述你不知道的坑点
1. LVS简介 1. 什么是LVS? LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内 ...
- mark::开源绘图工具graphviz
http://blog.csdn.net/iamljj/article/details/5862930 http://codeforces.com/contest/601/problem/D
- MYSQL基础常见常用语句200条
数据库 # 查看所有的数据库 SHOW DATABASES ; # 创建一个数据库 CREATE DATABASE k; # 删除一个数据库 DROP DATABASE k; # 使用这个数据库 US ...
- CDD All In One
CDD All In One 组件驱动开发 (CDD) refs https://www.componentdriven.org/ https://www.learnstorybook.com/int ...
- CSS3 弹性盒子(Flex Box)
1 CSS3 弹性盒子(Flex Box) 1 http://caniuse.com/#search=flex%20box https://www.w3.org/TR/css-flexbox-1/ C ...
- YouTube 视频下载工具
YouTube 视频下载工具 我不生产视频,只是优秀视频的搬运工! YouTube-dl https://github.com/search?q=youtube-dl https://github.c ...
- vue & components & props & methods & callback
vue & components & props & methods & callback demo solution 1 & props & data ...
- Taro UI
Taro UI 一套基于 Taro 框架开发的多端 UI 组件库 https://github.com/NervJS/taro-ui-demo https://taro-ui.aotu.io/#/do ...
- 蓝牙鼠标 & 罗技 M337
蓝牙鼠标 & 罗技 M337 蓝牙鼠标,有哪些不需要适配器的 https://www.logitech.com.cn/zh-cn/product/bluetooth-mouse-m337 ht ...