【Python日志功能】三.日志记录方法与多模块日志
文章目录
- 相关链接
- 第三篇:日志记录方法与多模块日志
- 1 基本日志记录方法
- 2 在多个模块中使用日志
- 3 文章总结
相关链接
- 【Python日志功能】一.日志基础与基本配置
- 【Python日志功能】二.高级配置与日志处理器
- 【Python日志功能】三.日志记录方法与多模块日志
- 官方文档:logging — Python 的日志记录工具 — Python 3.12.6 文档
- 个人博客:issey的博客 - 愿无岁月可回首
第三篇:日志记录方法与多模块日志
在大型项目中,代码通常被划分为多个模块或包。为了有效地跟踪和调试程序的运行,我们需要在各个模块中统一使用日志系统。本文将介绍如何在多模块项目中使用Python的logging
模块,涵盖基本的日志记录方法、异常信息的记录以及在多个模块中共享日志配置的方法。
1 基本日志记录方法
logging
模块提供了多种方法来记录不同级别的日志消息,这些方法对应着不同的严重程度级别:
debug
:调试信息,用于诊断问题,级别最低。info
:常规信息,确认程序按预期运行。warning
:警告信息,表明潜在的问题。error
:错误信息,程序已出现问题。critical
:严重错误,程序可能无法继续运行。
代码示例:
import logging# 创建日志记录器
logger = logging.getLogger('basic_logger')
logger.setLevel(logging.DEBUG)# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)# 创建格式化器并添加到处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)# 将处理器添加到日志记录器
logger.addHandler(console_handler)# 记录不同级别的日志
logger.debug('This is a DEBUG message')
logger.info('This is an INFO message')
logger.warning('This is a WARNING message')
logger.error('This is an ERROR message')
logger.critical('This is a CRITICAL message')
控制台输出:
2024-09-17 20:46:41,803 - basic_logger - DEBUG - This is a DEBUG message
2024-09-17 20:46:41,803 - basic_logger - INFO - This is an INFO message
2024-09-17 20:46:41,803 - basic_logger - WARNING - This is a WARNING message
2024-09-17 20:46:41,803 - basic_logger - ERROR - This is an ERROR message
2024-09-17 20:46:41,803 - basic_logger - CRITICAL - This is a CRITICAL message
logging
模块还提供了 exception
方法,用于记录异常信息。exception
方法会自动记录异常堆栈信息,非常适合在 try-except
语句中使用。
log_exception.py
:
import logging
import os# 获取脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))# 定义日志文件的路径
log_file_path = os.path.join(script_dir, 'log/exception.log')# 创建日志记录器
logger = logging.getLogger('exception_logger')
logger.setLevel(logging.DEBUG)# 创建控制台处理器和文件处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)file_handler = logging.FileHandler(log_file_path)
file_handler.setLevel(logging.DEBUG)# 创建格式化器并添加到处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)# 将处理器添加到日志记录器
logger.addHandler(console_handler)
logger.addHandler(file_handler)# 模拟异常并记录
try:result = 10 / 0
except ZeroDivisionError:logger.exception('An exception occurred')
log文件输出:
2024-09-17 20:53:46,430 - exception_logger - ERROR - An exception occurred
Traceback (most recent call last):File "/home/issey/workplace/Docker_workplace/Logger_Study/Course03/log_exception.py", line 32, in <module>result = 10 / 0
ZeroDivisionError: division by zero
2 在多个模块中使用日志
在实际项目中,代码通常被组织在不同的模块或包中。为了在整个项目中统一日志管理,我们可以创建一个基础的日志配置,并在各个模块中使用该配置。
项目结构
Course03/
├── main.py
├── module_a.py
└── module_b.py
main.py
:
import logging
from module_a import function_a
from module_b import function_b# 配置基础日志
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',handlers=[logging.StreamHandler(),logging.FileHandler('log/project.log')])# 创建主日志记录器
logger = logging.getLogger('main')# 记录主文件日志
logger.info('This is an INFO message from main')# 调用模块函数
function_a()
function_b()
module_a.py
:
import logging# 创建模块 A 的日志记录器
logger = logging.getLogger('module_a')def function_a():logger.debug('This is a DEBUG message from module A')logger.info('This is an INFO message from module A')logger.warning('This is a WARNING message from module A')try:result = 10 / 0except ZeroDivisionError:logger.exception('Exception occurred in module A')
module_b.py
:
import logging# 创建模块 B 的日志记录器
logger = logging.getLogger('module_b')def function_b():logger.debug('This is a DEBUG message from module B')logger.info('This is an INFO message from module B')logger.warning('This is a WARNING message from module B')try:result = [1, 2, 3][5]except IndexError:logger.exception('Exception occurred in module B')
当运行 main.py
时,日志将统一输出到控制台和 project.log
文件中,日志内容包括来自主模块和子模块的日志消息。
log日志输出:
2024-09-17 21:12:26,607 - main - INFO - This is an INFO message from main
2024-09-17 21:12:26,608 - module_a - DEBUG - This is a DEBUG message from module A
2024-09-17 21:12:26,608 - module_a - INFO - This is an INFO message from module A
2024-09-17 21:12:26,608 - module_a - WARNING - This is a WARNING message from module A
2024-09-17 21:12:26,608 - module_a - ERROR - Exception occurred in module A
Traceback (most recent call last):File "/home/issey/workplace/Docker_workplace/Logger_Study/Course03/module_a.py", line 11, in function_aresult = 10 / 0
ZeroDivisionError: division by zero
2024-09-17 21:12:26,608 - module_b - DEBUG - This is a DEBUG message from module B
2024-09-17 21:12:26,608 - module_b - INFO - This is an INFO message from module B
2024-09-17 21:12:26,609 - module_b - WARNING - This is a WARNING message from module B
2024-09-17 21:12:26,609 - module_b - ERROR - Exception occurred in module B
Traceback (most recent call last):File "/home/issey/workplace/Docker_workplace/Logger_Study/Course03/module_b.py", line 11, in function_bresult = [1, 2, 3][5]
IndexError: list index out of range
3 文章总结
在本篇文章中,我们探讨了Python logging
模块的日志记录方法以及如何实现统一的日志管理,通过设置全局的日志配置,保证所有模块的日志记录能够统一输出到同一位置,方便项目的集中管理和调试。这些内容为大型项目的日志系统提供了全面的解决方案。
相关文章:
【Python日志功能】三.日志记录方法与多模块日志
文章目录 相关链接第三篇:日志记录方法与多模块日志1 基本日志记录方法2 在多个模块中使用日志3 文章总结 相关链接 【Python日志功能】一.日志基础与基本配置【Python日志功能】二.高级配置与日志处理器【Python日志功能】三.日志记录方法与多模块日志官方文档&am…...

在pycharm终端中运行pip命令安装模块时,出现了“你要如何打开这个文件”弹出窗口,是什么状况?
这种情况发生在Windows系统上,当在PyCharm终端中运行pip命令安装模块时,如果系统无法确定要使用哪个程序打开该文件,就会出现“你要如何打开这个文件”弹出窗口。 解决方法是: 选择“查找一个应用于此文件”的选项。在弹出的窗口…...
Axure多人协调的方式
当系统有多个模块,又由不同的产品经理负责设计,如何进行协调? 尝试过的方法 1)搭建Axure私服,用Axure的私服进行一个RP文件多人协同编辑; 2)用SVN管理RP文件,每次都要合并。 以上…...

【深度学习】【OnnxRuntime】【Python】模型转化、环境搭建以及模型部署的详细教程
【深度学习】【OnnxRuntime】【Python】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【OnnxRuntime】【Python】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转on…...

React学习笔记(1.0)
在使用vite创建react时,有一个语言选项,就是typescript-SWC,这里介绍一下SWC。 SWC:可扩展的Rust的平台,用于下一代快速开发工具,SWC比Babel快20倍。 简单来说,就是用于格式转换的,…...

Axure RP实战:打造高效图形旋转验证码
Axure RP实战:打造高效图形旋转验证码 在数字产品设计的海洋中,验证码环节往往是用户交互体验的细微之处,却承载着验证用户身份的重要任务。 传统的文本验证码虽然简单直接,但随着用户需求的提高和设计趋势的发展,它…...

101012分页属性
4k页面 P(有效位):1有效,0无效 R/W(读写位):1可读可写,0可读 U/S(权限位):1(User),0(System) A(物理页访问位ÿ…...

从0-1 用AI做一个赚钱的小红书账号(不是广告不是广告)
大家好,我是胡广!是不是被标题吸引过来的呢?是不是觉得自己天赋异禀,肯定是那万中无一的赚钱天才。哈哈哈,我告诉你,你我皆是牛马,不要老想着突然就成功了,一夜暴富了,瞬…...
【Kubernetes】常见面试题汇总(十七)
目录 51.简述 Kubernetes 网络策略? 52.简述 Kubernetes 网络策略原理? 53.简述 Kubernetes 中 flannel 的作用? 54.简述 Kubernetes Calico 网络组件实现原理? 51.简述 Kubernetes 网络策略? - 为实现细粒度的容器…...
Vue 3 中动态赋值 ref 的应用
引言 Vue 3 引入了许多新特性,其中之一便是 Composition API。Composition API 提供了一种新的编程范式,使开发者能够更灵活地组织和复用逻辑。其中 ref 是一个核心概念,它允许我们在组件内部声明响应式的状态。本文将探讨如何在 Vue 3 中使…...
Spring Boot-应用启动问题
在使用 Spring Boot 进行开发时,应用启动问题是开发人员经常遇到的挑战之一。通过有效排查和解决这些问题,可以提高应用的稳定性和可靠性。 1. Spring Boot 启动问题的常见表现 Spring Boot 应用启动失败通常表现为以下几种情况: 应用启动…...
深入解析:如何通过网络命名空间跟踪单个进程的网络活动(C/C++代码实现)
在 Linux 系统中,网络命名空间(Network Namespaces)是一种强大的功能,它允许系统管理员和开发者隔离网络资源,使得每个命名空间都拥有独立的网络协议栈。这种隔离机制不仅用于容器技术如 Docker,也是网络安…...
C++ 科目二 [const_cast]
基础数据类型 const_cast 仅仅是深层拷贝改变,而不是改动之前的值 如果需要使用改动后的值,需要通过指针或者引用来间接使用 const int n 5; const string s "MyString";// cosnt_cast 针对指针,引用,this指针 // co…...

【电脑组装】✈️从配置拼装到安装系统组装自己的台式电脑
目录 🍸前言 🍻一、台式电脑基本组成 🍺二、组装 🍹三、安装系统 👋四、系统设置 👀五、章末 🍸前言 小伙伴们大家好,上篇文章分享了在平时开发的时候遇到的一种项目整合情况&…...

Hadoop生态圈拓展内容(一)
1. Hadoop的主要部分及其作用 HDFS(Hadoop分布式文件系统) HDFS是一个高容错、高可靠性、高可扩展性、高吞吐率的分布式文件存储系统,负责海量数据的存储。 YARN(资源管理调度系统) YARN是Hadoop的资源管理调度系统…...

使用随机森林模型在digits数据集上执行分类任务
程序功能 使用随机森林模型对digits数据集进行手写数字分类任务。具体步骤如下: 加载数据:从digits数据集中获取手写数字图片的特征和对应的标签。 划分数据:将数据集分为训练集和测试集,测试集占30%。 训练模型:使用…...

后端开发刷题 | 打家劫舍
描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家;如果偷了第二家࿰…...

欧美游戏市场的差异
欧洲和美国的游戏市场虽然高度发达且利润丰厚,但表现出由文化偏好、消费者行为、监管环境和平台受欢迎程度塑造的独特特征。这些差异对于寻求为每个地区量身定制策略的游戏开发商和发行商来说非常重要。 文化偏好和游戏类型 美国:美国游戏市场倾向于青…...

DeDeCMS靶场漏洞复现
打开靶场地址 姿势一:通过文件管理器上传webshell 1.登录后台 dedecms默认的后台登录地址为/dede 2.在附加管理里的文件式管理器中有文件上传 3.上传木马文件 4.访问木马文件 并连接 姿势二:修改模板文件获取webshell 1.点击模板里面的默认模板管理 …...

Transformer模型详细步骤
Transformer模型是nlp任务中不能绕开的学习任务,我将从数据开始,每一步骤都列举出来,然后对应重点的代码进行讲解 ------------------------------------------------------------------------------------------------------------- Trans…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...