测试平台系列(3) 给Hello World添加日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 给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

5.jpg

报错截图

发现居然报错了,我们仔细查看下控制台:

6.jpg

控制台报错信息

看提示是没有找到对应的文件或目录, 原来我们的pity目录下没有logs目录, 而这种日志库一般也不会帮忙创建目录,所以我们暂时手动在pity目录下建立logs目录即可。

建立以后重启服务, 再次尝试

7.jpg

成功截图

查看logs/pity.log文件


8.jpg

image

可以看到,日志文件配置生效,妈妈再也不用担心我意外出错了。


将日志类改为单例模式(选修课)

  • 编辑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




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
存储 运维 监控
超越传统模型:从零开始构建高效的日志分析平台——基于Elasticsearch的实战指南
【10月更文挑战第8天】随着互联网应用和微服务架构的普及,系统产生的日志数据量日益增长。有效地收集、存储、检索和分析这些日志对于监控系统健康状态、快速定位问题以及优化性能至关重要。Elasticsearch 作为一种分布式的搜索和分析引擎,以其强大的全文检索能力和实时数据分析能力成为日志处理的理想选择。
107 6
|
1月前
|
Java Shell
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
37 1
|
5天前
|
人工智能 供应链 安全
AI辅助安全测试案例某电商-供应链平台平台安全漏洞
【11月更文挑战第13天】该案例介绍了一家电商供应链平台如何利用AI技术进行全面的安全测试,包括网络、应用和数据安全层面,发现了多个潜在漏洞,并采取了有效的修复措施,提升了平台的整体安全性。
|
15天前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
65 1
|
1月前
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
22 1
「测试线排查的一些经验-中篇」&& 调试日志实战
|
1月前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
50 2
|
15天前
|
监控 安全 测试技术
构建高效精准测试平台:设计与实现全攻略
在软件开发过程中,精准测试是确保产品质量的关键环节。一个高效、精准的测试平台能够自动化测试流程,提高测试覆盖率,缩短测试周期。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
40 0
|
1月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
25 3
|
1月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
44 1
|
16天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
136 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板

热门文章

最新文章

下一篇
无影云桌面