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

news2024/11/27 18:25:02

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

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

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

很多时候,我们更多的是在已有的框架下编写业务功能代码,并不太熟悉如何去编写正规的日志管理代码,因此本文主要介绍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应用启动日志文件内容效果图如下:
在这里插入图片描述

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

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

相关文章

第一百一十六节 Java 面向对象设计 - Java 终止块

Java 面向对象设计 - Java 终止块 ​try ​块也可以有零个或一个​ finally​ 块。 ​finally ​块总是与 ​try ​块一起使用。 语法 使用 ​finally​ 块的语法是 finally {// Code for finally block }​finally​ 块以关键字 ​finally​ 开始,后面紧跟一对…

qemu 安装ubuntu -纯命令行-可ssh-带网络-可gdb linux kernel

1,预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount ubuntu-22.04.4-live-ser…

Linux系统安装Dify结合内网穿透实现远程访问本地LLM开发平台

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署大语言模型应用开发平台Dify,并结合cpolar内网穿透工具实现公网环境远程访问…

差分总结(一维+二维)

差分&#xff0c;可以视作前缀和的逆运算。 前缀和用于去求一个区间段的和 差分用于改变一个区间的值&#xff08;比如说某个区间都加上或者减去一个数&#xff09; P2367 语文成绩 #include<bits/stdc.h> using namespace std; #define int long long int n,p; int a…

问题解决:Problem exceeding maximum token in azure openai (with java)

问题背景&#xff1a; Im doing a chat that returns queries based on the question you ask it in reference to a specific database. For this I use azure openai and Java in Spring Boot. 我正在开发一个聊天功能&#xff0c;该功能根据您针对特定数据库的提问返回查询…

模型预测控制MPC详解(附带案例实现)

模型预测控制MPC详解&#xff08;附带案例实现&#xff09; 文章目录 模型预测控制MPC详解&#xff08;附带案例实现&#xff09;1. 最优控制问题2. 什么是MPC3. 二次规划Quadratic Programming4. MPC为什么可以转换成QP问题&#xff08;推导过程&#xff09;5. MPC总结5.1 MPC…

HTML静态网页成品作业(HTML+CSS+JS)——家乡莆田介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有5个页面。 二、作品…

卓越的 App UI 风格引领潮流

卓越的 App UI 风格引领潮流

QT基础 - 常见图表绘制

目录 零. 前言 一. 添加模块 折线图 三. 树状图 四. 饼图 五. 堆叠柱状图 六. 百分比柱状图 七. 散点图和光滑曲线图 散点图 光滑曲线图 零. 前言 Qt Charts 是 Qt 框架的一个模块&#xff0c;用于创建各种类型的图表和数据可视化。它为开发者提供了一套功能强大的工…

【面试干货】Java的基础类型和字节大小

【面试干货】Java的基础类型和字节大小 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;有八种基本数据类型&#xff0c;它们分别是&#xff1a;布尔型&#xff08;boolean&#xff09;、字节型&#xff08;byt…

什么是 SSH(安全外壳协议)以及如何工作

安全外壳协议&#xff08;Secure Shell&#xff0c;简称SSH&#xff09;&#xff0c;旨在取代未加密的协议&#xff08;如 Telnet 和 RSH&#xff09;和未受保护的文件传输协议&#xff08;如 FTP 和 RCP&#xff09;&#xff0c;在两个设备之间提供安全的加密连接。 安全外壳…

MyBatis 动态 SQL怎么使用?

引言&#xff1a;在现代的软件开发中&#xff0c;数据库操作是任何应用程序的核心部分之一。而在 Java 开发领域&#xff0c;MyBatis 作为一款优秀的持久层框架&#xff0c;以其简洁的配置和强大的灵活性被广泛应用。动态 SQL 允许开发人员根据不同的条件和场景动态地生成和执行…

Kubernetes部署Kanboard看板管理平台

【云原生】Kubernetes部署Kanboard项目管理平台 文章目录 【云原生】Kubernetes部署Kanboard项目管理平台介绍资源列表基础环境一、检查k8s环境1.1、检查工作节点状态1.2、检查系统pod状态 二、编辑kanboard.yaml文件2.1、创建项目目录2.2、编辑kanboard.yaml文件 三、部署Kanb…

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

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

推荐5个AI辅助生成论文、降低查重率的网站【2024最新】

一、引言 对于忙碌的学生来说&#xff0c;毕业论文通常是一项艰巨的任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;现在有一些工具可以帮助学生轻松完成论文。本文将介绍五个免费的AI工具&#xff0c;它们能够一键帮助你生成毕业论文&#xff0c;让你的学术生…

2024广东省职业技能大赛云计算赛项实战——Redis主从架构

Redis主从架构 前言 Redis是一个开源的内存数据结构存储系统&#xff0c;一般用于作为数据库、缓存和消息代理使用&#xff0c;而主从架构是许多分布式系统中常见的设计模式&#xff0c;用来提高系统的性能、可靠性和扩展性。 虚拟机使用的是自行创建的CentOS7&#xff0c;如…

记录SpringBoot启动报错解决

记录SpringBoot启动报错解决 报错现场 Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the following:If you want an embedde…

反转链表(java精简版)

反转一个单向链表。 public class ReversingLinkedList {static class Node {int val;Node next;public Node(int val) {this.val val;}public boolean hasNext() {return next ! null;}}public static void main(String[] args) {//构造Node head null;Node shift null;for…

MobileNet系列论文阅读笔记(MobileNetV1、MobileNetV2和MobileNetV3)

目录 引言MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications摘要Prior Work -- 先前工作MobileNet Architecture— MobileNet结构Depthwise Separable Convolution—深度可分离卷积Network Structure -- 网络结构 总结 MobileNetV2: Invert…

视频共享融合赋能平台LntonCVS视频监控业务平台建设安全煤矿矿井应用方案

随着我国经济的飞速增长&#xff0c;煤炭作为主要的能源之一&#xff0c;在我国的能源结构中扮演着至关重要的角色。然而&#xff0c;煤矿事故的频繁发生&#xff0c;不仅造成了巨大的人员伤亡和财产损失&#xff0c;也对社会产生了深远的负面影响。因此&#xff0c;实现煤矿的…