暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

只会写业务代码不会搭框架?干货:如何管理平台日志

程序员杨叔 2024-06-20
146


一、为什么需要日志管理?

日志是应用程序的重要组成部分,它记录了应用程序的运行状态、错误信息以及用户交互等关键信息。良好的日志管理可以帮助开发人员及时发现和解决问题,提高应用程序的稳定性和可靠性。

项目在本地开发调试时,我们可以直接通过本地编译器终端上的日志信息来分析排查问题。但是当框架部署到测试环境或者生产环境上时,想要再排查分析问题,则需要依赖日志文件。

很多时候,我们更多的是在已有的框架下编写业务功能代码,并不太熟悉如何去编写正规的日志管理代码,因此本文主要介绍Python如何快速规范地生成平台标准化的日志文件,希望对需要自己独立开发框架平台的同学能有所帮助。


二、生成平台标准化业务日志文件

2.1 假设我们的需求如下:




  • 应用程序每天生成一个对应的日志文件。

  • 文件名称要求包含当天的日期,方便查看日志。

  • 文件中只记录info级别以及更高级别的日志,不需要记录debug级别的日志,避免日志文件内容太多导致日志文件过大。

2.2 实现步骤






2.2.1 定义日志管理文件


新建日志管理文件,比如:log_manage.py,文件中详细代码如下:

    import logging
    import datetime




    def init_logger():
    # 获取当前日期
    current_date = datetime.date.today().strftime("%Y-%m-%d")


    # 创建日志记录器
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)


    # 检查是否需要重新创建日志文件处理器,确保每天都会生成新的日志文件
    if not any(handler.baseFilename.endswith(current_date + '.log') for handler in logger.handlers):
    # 创建文件处理器
    filename = f"app_{current_date}.log"
    file_handler = logging.FileHandler(filename)
    file_handler.setLevel(logging.INFO)


    # 创建日志格式器
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)


    # 添加处理器到记录器
    logger.addHandler(file_handler)


    return logger


    以上代码先获取当前日期,然后创建日志记录器,日志文件名中包含了当前日期。

    再判断检查当前日期是否与日志文件的日期相同,如果不同,则重新创建日志文件处理器。这样,当应用运行到新的一天时,就会自动创建新的日志文件,确保每天的操作日志都记录在当天的日志文件中。

    另外通过logger.setLevel(logging.INFO),设定只记录info级别以及更高级别的日志,避免了debug调试日志写入日志文件。



    2.2.2 业务操作如何记录日志


    在需要记录日志的业务操作文件中,先引入log_manage.py中的init_logger方法,然后使用logger.info就可以正常输出info级别的日志了。

    Python Flask框架代码示例如下:

      from flask_cors import CORS
      from utils.log_manage import init_logger


      app = Flask(__name__)
      logger = init_logger()


      CORS(app)


      # 测试日志
      @app.route('/test', methods=['GET'])
      def test():
      logger.info('info级别日志:test接口调用成功')
      logger.warning('warning级别日志:test接口调用成功')
      logger.error('error级别日志:test接口调用成功')
      logger.critical('critical级别日志:test接口调用成功')
      logger.debug('debug级别日志:test接口调用成功')
      return 'OK'




      if __name__ == '__main__':
      print('service is running')
      app.run(host="0.0.0.0", port=8089, debug=True)

      以上代码,我们在app.py文件中定义了一个test接口,用于测试各类日志结果输出。

      启动Flask程序后,访问 http://127.0.0.1:8089/test,接口成功:


      我们会看到框架下生成一个当天的日志文件,代码中我们使用logger记录了各种级别的日志,文件中正确记录了info及以上级别的日志:



      而比info级别更低的debug日志则没有记录。


      三、Flask框架生成应用日志文件

      最后除了业务操作日志之外,如果你还需要Flask应用的启动日志也记录到一个日志文件中,那么在参考前面的文章:Python Flask生产环境部署-多线程启动

      我们提到过Flask框架生产环境多线程启动,使用Gunicorn来部署你的Flask应用,启动命令如下:

        # 使用 Gunicorn 启动 Flask 应用
        gunicorn -w $WORKERS -b $HOST:$PORT wsgi:app > app.log 2>&1

        启动命令中增加:> app.log 2>&1, 则会将应用的启动日志写入到app.log文件中。

        命令解析:

        • app.log是将标准输出(stdout)重定向到文件app.log中

        • 而2>&1是将标准错误输出(stderr)重定向到与标准输出相同的位置,也就是app.log文件中。

        这样做的目的是将Gunicorn启动时产生的所有输出(包括标准输出和标准错误)都写入到app.log文件中,而不是打印到终端上。

        Flask应用启动日志文件内容效果图如下:



        END



        以上就是本次的全部内容,如果对你有帮助,麻烦点赞+分享,你的支持就是作者更新最大的动力!

        欢迎加入杨叔的测试交流群,沟通交流日常测试工作相关内容,2024一起升职加薪,学习进步!进群方式:扫下方二维码添加杨叔的微信号,备注:进群


        往期精彩文章推荐




        从繁琐到简单!Autotestplat自动化测试平台搭建使用

        pytest接口自动化测试框架搭建

        MySQL常用语句汇总-看这一篇就够了

        Redis缓存知识-穿透、击穿、雪崩

        springboot Demo框架实现注册登录

        文章转载自程序员杨叔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论