回顾

通过上篇内容,我们已经使用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. 页面中图片以背景图形式展示好还是以img标签形式展示

    img和background-image的异同: img是网页结构层面上的标签,页面中多一个img标签就会多一次http请求,且当我们浏览页面时,img标签作为网页结构的一部分,会在浏览器加载结构的过 ...

  2. Cloudera Manager 4.6 安装部署hadoop CDH集群

    Cloudera Manager 4.6 安装详解 1. Cloudera Manager介绍 1.1. 功能介绍 Cloudera Manager是一个针对hadoop集群的管理工具,功能包括:cd ...

  3. 超简单,centos7安装docker

    1.在centos7上直接yum安装docker [root@localhost ~]# yum install docker 2.启动docker [root@localhost ~]#servic ...

  4. node.js 连接 sql server 包括低版本的sqlserver 2000

    利用tedious连接,github地址:https://github.com/tediousjs/tedious 废话不多时直接上代码. connection.js var Connection = ...

  5. Data Binding Android - Type parameter T has incompatible upper bounds : ViewDataBinding and MainAct

    Go to your "some_layout.xml" Click right -> Refactor -> Rename (or SHIFT + F6) Renam ...

  6. fdisk与parted分区

    我所接触的linux分区分为两种,一种是使用fdisk分区,另外一种是parted分区.前者是针对MBR模式分区的,后者是针对GPT模式分区的 fdisk分区: fdisk -l ---->查看 ...

  7. python3通过纯真IP数据库查询IP归属地信息

    在网上看到的别人写的python2的代码,修改成了python3. 把纯真IP数据库文件qqwry.dat放到czip.py同一目录下. #! /usr/bin/env python # -*- co ...

  8. 小程序犯错(一):“ReferenceError: 模拟服务器传来的数据 is not defined”

    学习数据绑定,在onLoad中模拟服务器传数据时,报错:模拟服务器传来的数据 is not defined 我这里粗心的忘记注释说明了,如下: 把该行无关的错误数据注释或删除即可.这里提醒同学们,出现 ...

  9. 查询mssql的死锁语句

    都是从网上找的,只是记录一下,可能用到. 查询死锁,要在当前数据库下,否则tableName列得不到正确信息select    request_session_id spid,OBJECT_NAME( ...

  10. springboot快速入门(三)——Controller的使用

    一.概述 controller的分类: 相关的使用方式和springMVC的类似了,细节不再赘述 二.Controller使用 1.使用@controller注解 @Controller public ...