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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Sringboot+Vue的校园招聘系统【原创】【开源】

浏览器:Chrome或360浏览器 系统环境配置 前置条件:系统已经安装了Mysql5.7、Mysql工具(Navicat)、JDK1.8、Maven3.6.1、vue3.0以下开发环境、 Intellij Idea、 Chrome或360浏览器 1、导入数据库 2、编译前端代码vue 编译&…

HTML播放flv

页面效果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

森林火灾扑救特类车辆有哪些_鼎跃安全

森林消防是在森林火灾发生时&#xff0c;为了保护森林资源&#xff0c;防止火势蔓延&#xff0c;采取了一系列的应用措施&#xff0c;针对自然环境中的火灾消防工作。森林灭火主要包括预警、预防措施、火情监测、火势控制和灭火等&#xff0c;森林火灾发生的地形往往复杂崎岖&a…

【银河麒麟】高可用触发服务器异常重启,处理机制详解

1.服务器环境以及配置 【机型】物理机 处理器&#xff1a; Intel 内存&#xff1a; 126G 【内核版本】 4.19.90-25.16.v2101.ky10.x86_64 【银河麒麟操作系统镜像版本】 Kylin-Server-10-SP2-Release-Shenzhen-Metro-x86-Build01-20220619 Kylin-HA-10-SP2-Release-S…

yolov10打包为exe

一、前言 本节实验将官方yolov10推理程序打包为exe运行 二、代码 首先下载官方代码至本机&#xff0c;并使用conda创建虚拟环境&#xff0c;并安装好yolov10所需库 conda create --prefix E:/pyenv/myYolo10 python3.8 pip install -r requirements.txt 下载官方模型权重 …

深入理解和实现Windows进程间通信(消息队列)

常见的进程间通信方法 常见的进程间通信方法有&#xff1a; 管道&#xff08;Pipe&#xff09;消息队列共享内存信号量套接字 下面&#xff0c;我们将详细介绍消息队列的原理以及具体实现。 什么是消息队列&#xff1f; Windows操作系统使用消息机制来促进应用程序与操作系…

Git 查看当前分支是基于哪个分支拉取(源头分支)

场景&#xff1a; 项目中使用 Git 管理代码仓库的时候&#xff0c;随着项目的持续迭代及项目的扩展&#xff0c;多版本并行开发是非常常见的事情&#xff0c;多版本并行开发就伴随着多分支&#xff0c;随着 Git 的分支越拉越多&#xff0c;这时候很容易造成分支的混乱&#xf…

蓝牙模块在车载系统中的应用与集成:现状、挑战与未来展望

随着科技的快速发展&#xff0c;蓝牙技术已经深入到我们生活的方方面面&#xff0c;其中车载系统中的应用尤为显著。蓝牙模块作为一种无线通信技术&#xff0c;不仅为驾驶者提供了更加便捷的操作体验&#xff0c;同时也提升了驾驶的安全性。本文旨在分析蓝牙模块在车载系统中的…

selenium框架学习

概念 WEB自动化框架 三大组件: selenium IDE 浏览器插件,实现脚本录制WebDriver 实现对浏览器的各种操作(API包)Grid 实现同时对多个用例进行执行,用例在多个浏览器同步执行环境搭建 1、安装selenium: pip install selenium2、安装浏览器 3、安装浏览器驱动(对应的驱…

东郊到家类型小程序APP软件基于SpringBoot开发的系统源码

项目背景 在快节奏的现代生活中&#xff0c;人们越来越追求高效、便捷的生活方式。上门服务作为一种新型的服务模式&#xff0c;正逐渐受到广大用户的青睐。而这一切的背后&#xff0c;离不开技术的强大支撑。今天&#xff0c;我们就来探讨一下上门服务类型软件的技术魅力&…

React Native性能优化红宝书

一、React Native介绍 React Native 是Facebook在React.js Conf2015 推出的开源框架&#xff0c;使用React和应用平台的原生功能来构建 Android 和 iOS 应用。通过 React Native&#xff0c;可以使用 JavaScript 来访问移动平台的 API&#xff0c;使用 React 组件来描述 UI 的…

WebHttpServletRequestResponse(完整知识点汇总)

额外知识点 Web核心 Web 全球广域网&#xff0c;也成为万维网&#xff08;www&#xff09;&#xff0c;可通过浏览器访问的网站 JavaWeb 使用Java技术来解决相关Web互联网领域的技术栈 JavaWeb技术栈 B/S架构&#xff1a;Browser/Server&#xff0c;即浏览器/服务器 架构模式…

ROS2 概念以及通信方式

一、ros2的相关概念 ROS 2&#xff08;Robot Operating System 2&#xff09;是一个用于机器人开发的开源平台&#xff0c;它提供了一系列工具和库&#xff0c;用于构建机器人应用程序。相较于前身ROS&#xff08;ROS 1&#xff09;&#xff0c;ROS 2在设计上考虑了更多的实时…

IT入门知识第六部分《后端开发》(6/10)

目录 后端开发&#xff1a;构建强大的服务端逻辑 1.引言 2.后端技术概述 2.1 数据库 2.2 服务器 2.3 API 2.4 安全性 3.服务器和API 3.1 服务器的作用 3.2 API的作用 4.后端框架 4.1 Node.js 4.1.1 特点 4.1.2 用途 4.1.3 代码案例分析 4.2 Django 4.2.1 特点 …

mac赛车竞速游戏:弯道卡丁车车手 for Mac 中文版下载

《弯道卡丁车车手》是一款刺激的卡丁车竞速游戏&#xff0c;玩家扮演的是赛道上的卡丁车车手&#xff0c;需要在曲线崎岖的赛道上驾驶卡丁车&#xff0c;与其他车手展开激烈的竞速比赛。 游戏中有多种赛道可以选择&#xff0c;每个赛道都有不同的难度和特点&#xff0c;玩家需…

字节跳动的丝绸之路,豆包或将成为赛博“杨枝甘露”

大数据产业创新服务媒体 ——聚焦数据 改变商业 关于字节跳动有一个所有人都知道的秘密&#xff0c;那就是他们正在想方设法地海外扩张&#xff0c;以全球市场来驱动企业的新增长。美国曾经是字节跳动的第二战场&#xff0c;但是随着华盛顿相关法案的出台&#xff0c;在各种不…

docker-创建自定义网络,并给容器分配静态ip

文章目录 前言docker-创建自定义网络&#xff0c;并给容器分配静态ip1. 创建自定义 Docker 网络2. 给容器分配静态ip3. 验证 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的…

PyTorch梯度直通反传

有时我们想在层的输出端放置一个阈值函数。这可能出于多种原因。其中之一是我们想将激活总结为二进制值。这种激活的二值化在自编码器中很有用。 然而&#xff0c;阈值化在反向传播过程中会带来问题&#xff1a;阈值函数的导数为零。这种梯度的缺乏导致我们的网络无法学习任何…

MySQL:表的增删查改

文章目录 1.Create(创建)2.Retrieve(读取、查询)2.1 SELECT 列2.2 WHERE 子句2.3 结果排序(order by)2.4 筛选分页结果(limit、offset)2.5 Update更新2.6 Delete删除2.7 去重 3.聚合函数3.1 聚合函数的基本使用3.2group by子句的使用(分组查询) 增删查改&#xff1a;: Create(创…

Tailwindcss 扩展默认配置来自定义颜色

背景 项目里多个Tab标签都需要设置同样的背景颜色#F1F5FF&#xff0c;在集成tailwindcss之前就是重复该样式&#xff0c;如下图&#xff1a; .body {background-color: #f1f5ff; }集成tailwindcss时&#xff0c;我们希望在class中直接设置该背景色&#xff0c;但是默认的tai…