Python 日志模块 logging 的最佳实践,内容干练简洁

文章目录

  • 1. 引言
  • 2. 定义日志类
  • 3. 引用日志
  • 4. 参考


1. 引言

每次写 python 代码,想找一个日志模块 logging 的最佳实践,都要找一大圈,确不一定可以找到合适的最佳实践。

痛定思痛,我决定下笔记录目前觉得合适的 python 日志的用法,内容干练简洁!

2. 定义日志类

强烈建议定义一个日志类,不太建议用一个函数或者随意的几行代码去初始化,时间长了你就会发现有很多重复且零散的代码。

把日志模块单独放入到一个包中,例子如下:

import logging
import pathlib# 定义一个通用的日志类,封装 logging 包的用法
class Log:def __init__(self, file_name, logger_name=None, level=logging.INFO):self.file_name = file_nameself.level = levelself.logger = logging.getLogger(logger_name)self.logger.setLevel(self.level)self.init_log()def init_log(self):# FileHandler: 将格式化的日志记录写入磁盘文件的处理程序类handler = logging.FileHandler(self.file_name)handler.setLevel(self.level)formatter = logging.Formatter("[%(asctime)s - %(filename)s - %(name)s - %(levelname)s]: %(message)s")handler.setFormatter(formatter)self.logger.addHandler(handler)# StreamHandler: 将格式化的日志打印到前台stream_handler = logging.StreamHandler()stream_handler.setLevel(self.level)stream_handler.setFormatter(formatter)# 添加处理器self.logger.addHandler(stream_handler)def info(self, msg):self.logger.info(msg)def debug(self, msg):self.logger.debug(msg)def warning(self, msg):self.logger.warning(msg)def error(self, msg):self.logger.error(msg)def critical(self, msg):self.logger.critical(msg)# 以下根据情况去定义,可以初始化定义在这里,也可以根据自身情况定义在其他地方
log_path = pathlib.Path(__file__).parent.joinpath("biz.log")
log = Log(log_path)if __name__ == "__main__":log.info("test log")

注意,日志类最好是单例模式,即仅仅初始化一次,不要重复去初始化类!

3. 引用日志

例如,我的日志类定义在 pkg/log/log.py
在这里插入图片描述
引用使用日志的时候:

from pkg.log.log import log
...
if __name__ == '__main__':log.info("start to do")...log.info("finished")

这样运行的时候,就在文件 biz.log 以及控制台前台都输出了!

整体内容简洁易懂,没有其他多余的介绍,网上其他地方介绍了很多 python 日志的基础用法,我这里不介绍了,直接 copy 使用即可!

4. 参考

https://blog.51cto.com/u_16175525/6850774

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

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

相关文章

代码混淆:保护您的应用程序

目录 引言 什么是代码混淆? 代码混淆常见手段 代码混淆的作用 代码混淆可能带来的问题 常用的混淆工具 如何使用ipaguard进行混淆 总结 引言 在当今数字化时代,移动应用程序已经成为人们生活和工作中不可或缺的一部分。但是,随着应用…

Go语言实现数据结构栈和队列

Go语言实现数据结构栈和队列 1、栈 package mainimport "fmt"func main(){// 创建栈stack : make([]int, 0)// push压入栈stack append(stack, 10)// pop弹出v : stack[len(stack)-1]// 10fmt.Println(v)stack stack[:len(stack)-1]// 检查栈空// truefmt.Printl…

PPT插件-大珩助手-清除同类

清除同类-颜色 对于选定的形状,删除相同颜色 清除同类-文本 删除当前幻灯片中的文本对象 清除同类-非文本 删除当前幻灯片中的非文本对象 清空当页 删除当前幻灯片中的所有对象 选中的形状动画 删除选中的对象上的形状动画 当前页形状动画 对于当前页中的…

2023.9.1最长上升子序列

56368795 最长上升子序列:5679(严格小于号连接,LIS 最长不降子序列:56679(<连接,LNDS 最长下降子序列:875(LDS 最长不升子序列:665(LNIS 上升子序列最小划分数:划分成多个上升子…

MIB 变更周期

MIB 始终以 80 ms 的周期在 BCH 上传输并在 80 ms 内重复,并且它包括从小区获取 SIB1 所需的参数;如果 SSB 的周期大于 80 ms,则 MIB 的发送周期与 SSB 的周期相同。 在UE初始搜索时,SSB在半帧内的周期是20ms;所以对于…

Kotlin Collection KTX:让你的集合操作如丝般顺滑

当今移动应用开发,常常需要使用各种集合类型来存储和操作数据。Kotlin 提供了 Collection KTX 扩展库,为我们操作集合提供了非常方便的 API。在本篇文章中,我们将介绍 Collection KTX 中包含的所有扩展函数,让你的集合操作变得更加…

2024系统分析师---论软件的可靠性设计

摘要: 本人于2018年1月参与了中石化XX油田XX采油厂“用电管理系统”的项目建设,该系统建设目标是实现分单位、分线路、分系统评价、优化、考核,全面提升采油厂用电管理水平。在该项目组中我担任系统架构师一职,主要负责系统整体架…

Linux第23步_安装windows下的stm32cubeprogram软件

stm32cubeprogram软件是通过USB3.0接口烧写系统软件。 1、双击“05、开发工具\02、ST官方开发工具\en.stm32cubeprog_v2-5-0\SetupSTM32CubeProgrammer-2.5.0.exe”。 2、点击“Next” 3、点击“Next” 4、勾选“I agree”,点击“Next” 5、点击“Next” 6、点…

阴盘奇门八字排盘马星位置计算方法php代码

如下位置,马星的四个位置。 计算方法: 1。先根据出生年月日,计算得八字四柱。比如 2024年01月09日,四柱为 其中时柱地支为“申” 2。然后根据以下对应的数组,来找到id号,即马星位置。 根据下表来找到&am…

iPhone语音备忘录怎么导出?这3种方法任你选择!

作为iPhone用户,我们应该会经常使用语音备忘录来记录一些重要的信息。有时候,我们可能需要将这些语音备忘录导出,以方便分享或备份。iphone语音备忘录怎么导出?今天,小编将为大家介绍3种导出iPhone语音备忘录的方法&am…

阿里云RDMA通信库XRDMA论文详解

RDMA(remote direct memory access)即远端直接内存访问,是一种高性能网络通信技术,具有高带宽、低延迟、无CPU消耗等优点。RDMA相比TCP在性能方面有明显的优势,但在编程复杂度上RDMA verbs却比TCP socket复杂一个数量级。 开源社区和各大云厂…

fpga目前就业形势咋样?

FPGA今年各厂给本科生的薪资大概是15-30K,研究生是20-40K,平均薪资在25k左右, 当然具体薪资还要看去哪个公司,哪个城市,以及个人的学校、专业、能力水平、及包括面试时的表现,运气等,这些都会导…

雍禾植发袁宣心中有“术”,雍禾医疗帮用户重启人生

从公立医院烧伤外科来到雍禾,可以说是袁宣职业生涯里最重要的一个决定。据了解,袁宣医生所在的雍禾植发,是国内最大的毛发医疗机构。截至2022年12月31日,雍禾医疗已组建1341人的专业医疗团队,其中毛发医生294人&#x…

从零实现一套低代码(保姆级教程) --- 【15】实现轮播图组件并增加容器子节点类型的控制

摘要 接上一篇,我们继续实现另外一个比较常见的组件。轮播图,在一些官网的页面中,这个组件是非常常见的。 如果你是第一次看到这一篇文章, 建议先看一下第一节内容: 从零实现一套低代码(保姆级教程&#…

一个Pygame的Hello World示例程序

创建一个标题为Hello World的窗口,窗口中间显示有Pygame的Logo的python代码 import sys import pygamedef main():pygame.init()screen pygame.display.set_mode((800, 400))pygame.display.set_caption("Hello World")logo pygame.image.load("p…

2024 年 API 管理新趋势预测

本文译自:What Will Be the API Management Trends for 2024? 原文链接:What Will Be the API Management Trends for 2024? - The New Stack 原文作者:Kenn Hussey 预计到 2030 年末,API 管理 市场的规模将增长六倍&…

frp 通过自定义域名访问内网的 Web 服务 --来自官网

通过自定义域名访问内网的 Web 服务 通过简单配置 HTTP 类型的代理,您可以让用户通过自定义域名访问内网的 Web 服务。 HTTP 类型的代理非常适合将内网的 Web 服务通过自定义域名提供给外部用户。相比于 TCP 类型代理,HTTP 代理不仅可以复用端口&#…

压测clickhouse性能相关参数

背景:压测ck性能一直上不去,但是ck负载不大。尝试调整参数,验证是否有性能提升 1、background_common_pool_size Sets the number of threads performing background non-specialized operations like cleaning the filesystem etc. for ta…

为什么是设置512,1024之类的像素大小

选择 (512 \times 512)、(1024 \times 1024) 等像素大小的原因与计算机科学中的一些基本概念有关: 二进制和内存对齐:计算机系统基于二进制运作,因此处理二的幂次方的数值(如 (2^9 512), (2^{10} 1024) 等)时更为高效…