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

Python Logging 模块

《Python基础教程》 19.5 日志

日志与第16章讨论的测试有一定的关系,而且在需要大规模改造程序的内部构造时很有用,它无疑能够帮助你发现问题和bug。日志大致上就是收集与程序运行相关的数据,供你事后进行研究或积累。

日志的最简单实现形式是:打开一个文件,用print语句写入内容,关闭文件。

更规范的做法是使用标准库中的模块logging。这个模块的基本用法非常简单,代码清单19-3所示的程序证明了这一点。

import logging
logging.basicConfig(level=logging.INFO, filename='mylog.log')
logging.info('Starting program')
logging.info('Trying to divide 1 by 0')
print(1 / 0)
logging.info('The division succeeded')
logging.info('Ending program')

运行这个程序时,将生成下面的日志文件:

INFO:root:Starting program
INFO:root:Trying to divide 1 by 0

如你所见,试图将1除以0后什么都没有记录下来,因为这种错误将导致程序终止。这是一种简单的错误,你可根据程序崩溃时在终端打印的异常来跟踪确定问题出在什么地方。

不会导致程序终止、而只是让它行为异常的bug是最难查找的,但通过查看详尽的日志文件也许能够帮助你找出问题出在什么地方。

聚合搜索结果

Python 的 logging 模块提供了一种灵活的日志记录系统,适用于应用程序和库。这个模块定义了函数和类,用于实现事件日志记录,所有 Python 模块都可以参与日志记录,这意味着您的应用程序日志可以包含您自己的消息和第三方模块的消息。

基本用法

在 Python 中,可以通过 logging 模块的 basicConfig 方法进行基本配置,然后使用不同的日志级别函数(如 debug, info, warning, error, critical)来记录日志。以下是一个简单的示例:

import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 创建 logger 对象
logger = logging.getLogger(__name__)
# 记录不同级别的日志
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")

日志级别

logging 模块默认定义了多个日志级别,日志优先级从高到低为:CRITICAL > ERROR > WARNING > INFO > DEBUG。当日志级别设置为某个级别时,低于该级别的日志将不会被输出。例如,如果日志级别设置为 INFO,则 DEBUG 级别的日志将不会被输出。

高级用法

除了基本用法外,logging 模块还支持更高级的功能,如将日志同时输出到屏幕和文件、日志轮转、通过 JSON 或 YAML 文件配置日志等。例如,使用 RotatingFileHandler 可以实现日志文件的轮转,当日志文件达到一定大小时,它会自动创建新的日志文件,并保留旧的日志文件。

配置文件

从 Python 2.7 开始,可以通过字典、JSON 或 YAML 文件来加载和配置日志。这种方式更加灵活,可以轻松地在不同环境中切换日志配置,而无需修改代码。

轮转日志示例

以下是一个使用 RotatingFileHandler 的示例,它设置了日志文件的最大大小和备份数量:

import logging
from logging.handlers import RotatingFileHandlerlogger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
rHandler = RotatingFileHandler('log.txt', maxBytes=1*1024, backupCount=3)
rHandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rHandler.setFormatter(formatter)
logger.addHandler(rHandler)logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")

http://www.mrgr.cn/news/54250.html

相关文章:

  • [网络协议篇] ICMP协议
  • Redis入门:在Java程序中高效使用Redis
  • 排序02 Multi-gate Mixture-of-Experts (MMoE)
  • Synopsys工具中命令中filter选项
  • webstorm 编辑器配置及配置迁移
  • ​1553B总线的前景和应用
  • Unexpected error: java.security.InvalidAlgorithmParameterException
  • 关于office中的word文档图片替换问题
  • MySQL程序介绍<二>
  • freeswitch-esl 进行强拆控制
  • 【代码随想录Day46】单调栈Part01
  • 探索计算机技术的无限可能:从基础到前沿的深度之旅
  • PCL 点云配准 非线性加权最小二乘优化的点到面ICP算法(精配准)
  • 使用 NVBit 进行内存访问跟踪指南
  • 希尔(shell)排序
  • 深入理解Reactor核心概念
  • 【部署篇】RabbitMq-02单机模式部署
  • [H264]x264_encoder_headers函数
  • 第六十一周周报 MDSSSA-GNN
  • 计算机毕业设计Spark+大模型高考分数线预测 知识图谱高考志愿推荐系统 高考数据分析可视化 高考大数据 大数据毕业设计
  • 【洛谷】P1856
  • 【H2O2|全栈】WPS/Office系列有哪些好用的快捷方式?
  • Javaweb基础-axios
  • 学习虚幻C++开发日志——TSet
  • 推荐系统 # 二、推荐系统召回:协同过滤 ItemCF/UserCF、离散特征处理、双塔模型、自监督学习、多路召回、曝光过滤
  • MySQL 索引:优化数据库性能的关键