回顾

通过上篇内容,我们已经使用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添加日志的更多相关文章

  1. ASP.NET Core 添加日志NLog

    1.在Nuget上搜索 NLog.Extensions.Logging 安装最新版 2.添加日志配置文件,在项目指定目录下添加配置文件nlog.config,内容添加如下: <?xml vers ...

  2. Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式

    原文:Wix学习整理(7)--在开始菜单中为HelloWorld添加卸载快捷方式 通过前面的几篇随笔,我们已经给我们的HelloWorld提供了填写注册表信息,以及开始菜单快捷方式和桌面快捷方式.这些 ...

  3. (译)Windsor入门教程---第五部分 添加日志功能

    介绍     现在我们已经有了基础的框架了,是时候添加内容了,那么我们首先应该考虑的就是在应用程序中添加日志功能.我们会使用Windsor来配置,在这一部分,你将学习Windsor之外的其他功能. L ...

  4. net core中动态给log4net添加日志类型

    private static object m_Lock = new object(); /// <summary> /// 根据类型获取对应的日志操作类 /// </summary ...

  5. Flask--(项目准备)--添加日志

    日志:记录程序运行的状态,在manage.py同级目录下创建logs文件夹 定义日志文件: import logging from logging.handlers import RotatingFi ...

  6. ThinkPHP执行调用存储过程添加日志

    本文出至:新太潮流网络博客 //PHP代码部分 /** * [LogAdd 操作日志] * @param [string] $userid [用户的ID] * @param [string] $typ ...

  7. SSIS教程:创建简单的ETL包 -- 3. 添加日志(Adding Logging)

    Microsoft Integration Services 包含日志记录功能,可通过提供任务和容器事件跟踪监控包执行情况以及进行故障排除. 日志记录功能非常灵活,可以在包级别或在包中的各个任务和容器 ...

  8. memcached添加日志输出

    引子:qa的memcached总是隔一段时间挂掉,导致qa进不去.决定查一下原因,于是添加日志输出,等下次出错便于查阅.定位问题. memcache默认没有日志输出.如果想把memecache服务日志 ...

  9. selenium===selenium自动化添加日志(转)

    本文转自 selenium自动化添加日志 于logging日志的介绍,主要有两大功能,一个是控制台的输出,一个是保存到本地文件 先封装logging模块,保存到common文件夹命名为logger.p ...

随机推荐

  1. VMware三个版本号workstation、server、esxi的差别

    VMware三个版本号 workstation: 单机级.用在个人桌面系统中.须要操作系统支持 servier:工作组级,用于服务器.须要操作系统支持 esxi:企业级,用于服务器,不须要操作系统支持 ...

  2. 1101: [POI2007]Zap

    Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同 ...

  3. php官网下载的chm手册,源码字号太小的问题解决

    首先,到官方网站上下载chm格式的文档,地址如下: http://php.net/downloads.php 如图,点击荧光笔标出链接 然后就可以看到各种语言版本的文档手册,可以选择中文版,并带有笔记 ...

  4. Java类是如何默认继承Object的?

    原:https://juejin.im/post/5ca1e8ade51d454e6a300048 前言 学过Java的人都知道,Object是所有类的父类.但是你有没有这样的疑问,我并没有写exte ...

  5. ios学习路线—Objective-C(Runtime消息机制)

    RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何 ...

  6. Object C学习笔记12-集合

    这里讲到的集合是指Set集合,其实Array也是一种类型的集合.在Object C中提供了两个集合类NSSet和NSMutableSet.其实NSSet和NSArray性质一样,都是用于存储对象的. ...

  7. 第一次码java感想及前三次作业总结

    写在前面 嗯,首先是java,这学期第一次oo作业布置下来的周末才开始看的,第一次作业因此写得有些手忙脚乱.不过大概看了一遍后发现比c好用,入门更简单吧,好多操作直接import一下就能用了,码代码的 ...

  8. head 标签里有什么?

    head 标签里有什么? 每一个 HTML 文档中,都有一个不可或缺的标签:<head> ,它作为一个容器,主要包含了用于描述 HTML 文档自身信息(元数据)的标签,这些标签一般不会在页 ...

  9. RabbitMQ(三):消息持久化策略

    原文:RabbitMQ(三):消息持久化策略 一.前言 在正常的服务器运行过程中,时常会面临服务器宕机重启的情况,那么我们的消息此时会如何呢?很不幸的事情就是,我们的消息可能会消失,这肯定不是我们希望 ...

  10. comet 推送消息到客户端

    weiconfig: <system.web> <httpHandlers> <add path="comet_broadcast.ashx" typ ...