当前位置: 首页 > news >正文

Python日志管理利器:如何高效管理平台日志

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

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

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

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

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

2.1 假设我们的需求如下:
  • 应用程序每天生成一个对应的日志文件。
  • 文件名称要求包含当天的日期,方便查看日志。
  • 文件中只记录info级别以及更高级别的日志,不需要记录debug级别的日志,避免日志文件内容太多导致日志文件过大。
2.2 实现步骤
2.2.1 定义日志管理文件

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

import logging
import datetimedef 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_loggerapp = 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应用启动日志文件内容效果图如下:
在这里插入图片描述

相关文章:

  • 【机器学习】智能创意工厂:机器学习驱动的AIGC,打造未来内容新生态
  • CentOS中的rename命令
  • 别让日志拖垮网站速度
  • Python多语言欧拉法和预测校正器实现
  • 20240621每日后端---------如何优化项目中的10000个if-else 语句?
  • ⭐Unity 控制任意UI的渐隐渐显
  • JDBC从入门到精通-笔记(一):JDBC基本概念与开发基础
  • 构建安全高效的前端权限控制系统
  • Flutter 实现软鼠标
  • 寻找重复数 - LeetCode 热题 100
  • QCombox绑定QMap
  • Map-JAVA面试常问
  • exzxml C语言XML解析库使用记录
  • selenium框架学习
  • Aigtek电压放大器的主要作用是什么
  • 收藏网友的 源程序下载网
  • CentOS7简单部署NFS
  • Leetcode 27 Remove Element
  • mysql innodb 索引使用指南
  • Next.js之基础概念(二)
  • Python 反序列化安全问题(二)
  • React的组件模式
  • yii2中session跨域名的问题
  • Zepto.js源码学习之二
  • 从重复到重用
  • 诡异!React stopPropagation失灵
  • 技术胖1-4季视频复习— (看视频笔记)
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  •  一套莫尔斯电报听写、翻译系统
  • MyCAT水平分库
  • ​configparser --- 配置文件解析器​
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • $ git push -u origin master 推送到远程库出错
  • (52)只出现一次的数字III
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Python第六天)文件处理
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (过滤器)Filter和(监听器)listener
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (十五)使用Nexus创建Maven私服
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (算法)大数的进制转换
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET WPF 抖动动画
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [000-01-008].第05节:OpenFeign特性-重试机制
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作