4. 为HelloWorld添加日志
回顾
通过上篇内容,我们已经使用flask编写了我们的第一个接口或者说是html页面。我们可以看到,使用flask来编写接口/页面是十分简单的。那么接下来,我们丰富一下上面的例子。
需求
现在的需求来了,在我们平时的开发过程中,总会遇到一些问题。但是又不是必现的,所以我们可以通过一些手段来写入日志,去发现问题。一个很明显的例子就是try/exception,遇到未知问题的时候可以将问题记录至日志并在事后排查。
日志模块选用
- logging
我们知道,在Python中有系统自带的功能及其强大的logging模块供我们使用,它的强大不多做介绍了。网上的demo很多,稍微copy一个日志类就能使用。
- logbook
这里我采用的是github上的logbook库,单看api调用的话,比logging方便较多。可能因为我是个喜欢尝鲜的人_··
安装logbook
在终端输入pip3 install logbook
并回车。
分类
日志模块属于Lamb的工具类,所以我将之划分到app/utils下。
编写日志类
import logbook
from .. import app
class Log(object):
handler = None
def __init__(self, name='app', filename=app.config['LOG_NAME']): # Logger标识默认为app
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是日志的分类,如果不传入则默认为app
,filename(日志文件名)默认值为引入app.config中配置的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
查看logs/lamb.log文件
可以看到,日志文件配置生效,妈妈再也不用担心我意外出错了。
将日志类改为单例模式(选修课)
- 编辑utils/decorator.py
'''
这是一个装饰器方法文件
'''
class SingletonDecorator:
def __init__(self, cls):
self.cls = cls
self.instance = None
def __call__(self, *args, **kwds):
if self.instance == None:
self.instance = self.cls(*args, **kwds)
return self.instance
如图所示,这是一个单例类的装饰器。首先判断该类的实例是否是None,为None的话则生成新实例,否则返回该实例。这样就确保了只生成一次实例。
当然这只是一个办法,可能在多线程的情况下会出问题。后续的优化和了解,就交给同学们自己了。
- 给Log类加上装饰器
import logbook
from .decorator import SingletonDecorator # 引入装饰器类
from .. import app
#注意这里
@SingletonDecorator
class Log(object):
handler = None
def __init__(self, name='app', filename=app.config['LOG_NAME']): # Logger标识默认为app
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)
上一篇: 第一个程序Hello, World!
下一篇: emmmmm暂时没写
github地址: https://github.com/wuranxu/Lamb
4. 为HelloWorld添加日志的更多相关文章
- ASP.NET Core 添加日志NLog
1.在Nuget上搜索 NLog.Extensions.Logging 安装最新版 2.添加日志配置文件,在项目指定目录下添加配置文件nlog.config,内容添加如下: <?xml vers ...
- Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式
原文:Wix学习整理(7)--在开始菜单中为HelloWorld添加卸载快捷方式 通过前面的几篇随笔,我们已经给我们的HelloWorld提供了填写注册表信息,以及开始菜单快捷方式和桌面快捷方式.这些 ...
- (译)Windsor入门教程---第五部分 添加日志功能
介绍 现在我们已经有了基础的框架了,是时候添加内容了,那么我们首先应该考虑的就是在应用程序中添加日志功能.我们会使用Windsor来配置,在这一部分,你将学习Windsor之外的其他功能. L ...
- net core中动态给log4net添加日志类型
private static object m_Lock = new object(); /// <summary> /// 根据类型获取对应的日志操作类 /// </summary ...
- Flask--(项目准备)--添加日志
日志:记录程序运行的状态,在manage.py同级目录下创建logs文件夹 定义日志文件: import logging from logging.handlers import RotatingFi ...
- ThinkPHP执行调用存储过程添加日志
本文出至:新太潮流网络博客 //PHP代码部分 /** * [LogAdd 操作日志] * @param [string] $userid [用户的ID] * @param [string] $typ ...
- SSIS教程:创建简单的ETL包 -- 3. 添加日志(Adding Logging)
Microsoft Integration Services 包含日志记录功能,可通过提供任务和容器事件跟踪监控包执行情况以及进行故障排除. 日志记录功能非常灵活,可以在包级别或在包中的各个任务和容器 ...
- memcached添加日志输出
引子:qa的memcached总是隔一段时间挂掉,导致qa进不去.决定查一下原因,于是添加日志输出,等下次出错便于查阅.定位问题. memcache默认没有日志输出.如果想把memecache服务日志 ...
- selenium===selenium自动化添加日志(转)
本文转自 selenium自动化添加日志 于logging日志的介绍,主要有两大功能,一个是控制台的输出,一个是保存到本地文件 先封装logging模块,保存到common文件夹命名为logger.p ...
随机推荐
- Java 实现对文件系统的监控
在开发中经常会用到监控文件或是目录的状态,如果你还在手写轮巡扫描文件的话,那你久out了. 1. Commons io为我们提供了一套可靠.高性能的一套文件系统监控API 1.1. 需要的jar包如下 ...
- 深入 Java 调试体系: 第 1 部分,初探JPDA 体系
JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程 ...
- JavaScript的DOM操作获取元素的大小
通过 style 内联获取元素的大小 需要注意的是style 获取只能获取到行内 style 属性的 CSS 样式中的宽和高,如果有获取:如果没有则返回空. <!DOCTYPE html> ...
- 洛谷 P4012 深海机器人问题【费用流】
题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...
- 【转】 Android应用内多进程分析和研究
正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行.但是如果需要将某些组件(如Service.A ...
- java 项目开启mysql binlog参数后报500错误:
问题: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and ...
- 【gulp】Gulp的安装和配置 及 系列插件
注意:要安装俩次gulp(全局和本地):全局安装gulp是为了执行gulp任务,本地安装gulp则是为了调用gulp插件的功能. 之前由大牛帮忙配置的gulp来用.今天时间充裕,就和小伙伴一起动手配置 ...
- 白帽子讲web安全——访问控制
上一章说的认证与会话管理,这章是访问控制,刚看访问控制这章的时候,感觉跟上章的“授权”没什么区别,第一感受就是“授权”. 之后看了才进一步了解,“授权”是好比屋子的主人进来了,那么他可以坐在客厅,也可 ...
- mysql 5.7.12 winx64安装配置方法图文教程
这篇文章主要为大家分享了mysql 5.7.12winx64安装配置方法图文教程,感兴趣的朋友可以参考一下 之前安装mysql时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录, ...
- Node.js 从入门到茫然系列——入门篇
在创建服务的时候,我们一般代码就是: var http = require("http"); var server = http.createServer(function(req ...