追踪问题——用Python Logging模块更轻松地诊断错误

简介: 追踪问题——用Python Logging模块更轻松地诊断错误

前言


Logging模块是Python标准库中的一个模块,用于记录和输出代码执行时的信息、警告、错误等日志。


0、logging模块的作用


Logging模块是Python标准库中用于记录和输出代码执行时的日志信息的一个工具。它可以记录程序在运行过程中发生的各种事件和错误,如异常、警告、调试信息等,并将这些信息输出到不同的目标位置,如控制台、文件、网络等,以便开发者和管理员更好地理解和调试程序。


Logging模块的作用可以总结为以下几点


  • 支持多种日志级别:Logging模块支持多种不同的日志级别,包括DEBUG、INFO、WARNING、ERROR、CRITICAL等,开发者可以根据需要选择适合的级别记录不同程度的信息。
  • 自定义日志格式:Logging模块提供了灵活的配置选项,允许开发者自定义日志的格式,包括日期、时间、日志级别、模块名、函数名等等信息,使得开发者可以根据自己的需要记录和查看日志信息。
  • 支持多种输出方式:Logging模块可以将日志信息输出到不同的目标位置,包括控制台、文件、网络等,同时也支持多种输出格式,如JSON、CSV等。
  • 帮助调试和故障排查:Logging模块可以帮助开发者更快地定位和解决问题,如调试程序、发现潜在问题、监控系统运行状况等。


总之,Logging模块可以帮助开发者更好地理解和调试程序,同时也可以帮助管理员监视和维护应用程序。它是Python编程中非常重要的一个工具。


一、logging.basicConfig()


logging.basicConfig():logging.basicConfig()是Logging模块中用于配置基本日志行为的函数。它通常是Logging模块的第一个被调用的函数,用于配置日志输出的基本信息。


logging.basicConfig()函数可以接受一些关键字参数,用于指定日志输出的格式、级别和目标位置等信息。常用的参数如下:

# define: 顾名思义,basciConfig是用来设置一些日志的的配置参数
# 参数介绍:
# filename: 指定保存日志的文件名
# filemode: 指定打开文件的模式,默认为'a',即追加模式,也可以设置为'w', 即每次写日志的时候会覆盖之前的日志。
# format: 指定输出的格式和内容,详见三
# datefmt: 指定时间格式
# level:指定日志的记录级别,默认为logging.WARNING, 详见第二点
# eg:经常使用的参数是filename、level、format,其他一般采取默认。
import logging
logging.basicConfig(filename='Hello.log', level=logging.ERROR, format = '[%(asctime)s]-%(thread)d-%(levelname)s(%(name)s): %(message)s - %(filename)s:%(lineno)d')

需要注意的是,logging.basicConfig()函数只能在第一次调用Logging模块的时候生效,而且是全局生效的,也就是说一旦设置了基本的配置参数,后续的所有Logging输出都会受到影响。因此,如果需要更细粒度地控制Logging模块的行为,应该使用Logger和Handler等更高级的组件来完成。


二、日志等级

  • Logging模块中定义了5个不同等级的日志级别,分别是:


# 日志由低到高
# DEBUG: 记录最详细的日志信息。调试bug时使用。
# INFO: 记录一些设置的关键节点信息。正常操作信息。
# WARNING: 警告,记录一些以后可能会出错的信息,但是现在可以正常运行。
# ERROR: 错误,记录由于更严重的问题而导致软件无法执行某些功能时的信息。
# CRITICAL: 严重,记录发生严重错误,程序本身可能无法继续运行时的信息。即致命错误信息。
# 默认的等级是WARNING,即warning级别及以上的日志会输出。
import logging
# 设置日志级别为DEBUG
logging.basicConfig(level=logging.DEBUG)
# 输出不同级别的日志信息
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
  • 默认情况下,Logging模块只会输出WARNING级别及以上的日志信息,也就是说,只有当出现警告、错误、严重错误等情况时,Logging模块才会输出日志信息。
  • 上述代码中,设置了日志级别为DEBUG,因此Logging模块将输出所有等级的日志信息。而如果将日志级别设置为WARNING,只有WARNING、ERROR、CRITICAL级别的日志信息才会输出。


总之,在使用Logging模块时,开发者可以根据需要选择不同的日志级别,以便更好地控制和调试程序。


三、输出格式参数format。


Logging模块中,可以通过format参数来指定输出日志的格式。format参数是一个字符串,其中包含变量和文字。当Logging模块输出日志时,它将根据format字符串来生成日志信息。


format字符串中可以包含以下变量:

# 日志级别:%(levelno)s
# 日志级别名称:%(levelname)s
# 当前程序的路径:%(pathname)s
# 当前程序名称:%(filename)s
# 日志所属的当前函数:%(fileName)s
# 日志的时间:%(asctime)s
# 线程的名称:%(threadName)s
# 日志的信息:%(message)s
# 日志的当前行号:%(lineno)d
# 线程的ID:%(thread)d
# 进程的ID:%(process)d
# 例如,如果要输出日志的时间、日志级别和日志信息,可以使用以下的format参数:
import logging
logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.INFO)
logging.info('This is an info message.')

上述代码中,format字符串包含了三个变量:asctime、levelname和message。其中asctime代表时间,levelname代表日志级别,message代表日志信息。输出结果类似于:

2023-03-17 14:20:34,123 INFO: This is an info message.

四、进阶使用


4-1、日志输出到文件


日志输出到文件:默认情况下,Logging模块将日志输出到控制台。如果需要将日志输出到文件中,可以通过指定filename参数来实现:

import logging
logging.basicConfig(filename='example.log', level=logging.INFO)
logging.info('This is an info message.')

4-2、日志旋转

日志旋转:如果需要定期清理和归档日志文件,可以使用logging.handlers模块中的RotatingFileHandler或TimedRotatingFileHandler来实现。

import logging.handlers
handler = logging.handlers.TimedRotatingFileHandler('example.log', when='midnight', backupCount=7)
handler.setLevel(logging.INFO)
logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', handlers=[handler])
logging.info('This is an info message.')
  • 上述代码中,使用TimedRotatingFileHandler来处理日志,设置when参数为’midnight’,表示在每天午夜生成新的日志文件,backupCount参数表示最多保存7个旧日志文件。


4-3、日志过滤

日志过滤:如果需要过滤某些日志信息,可以使用Logging模块中的Filter类来实现。例如:

import logging
class MyFilter(logging.Filter):
    def filter(self, record):
        return 'important' in record.getMessage()
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
handler.addFilter(MyFilter())
logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', handlers=[handler])
logging.info('This is an info message.')
logging.info('This is an important message.')


上述代码中,自定义了一个MyFilter类,过滤不包含’important’字符串的日志信息。


4-4、使用Logger对象


使用Logger对象:除了使用Logging模块中的basicConfig函数外,还可以使用Logger类来创建和处理日志信息。例如:


import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info('This is an info message.')


  • 上述代码中,使用Logger类来创建logger对象,并添加handler和formatter。这种方式可以更灵活地控制日志的处理和输出。
  • 总之,在使用Logging模块时,开发者需要考虑到各种因素,如日志的处理方式、格式、输出位置、过滤等,以便更好地记录和调试程序。


参考文章:

logging日志的四个等级和使用.

Python实用教程系列——Logging日志模块.

logging的理解和使用.

logging — Python 的日志记录工具.


总结


✌,小论文终于有了一点点进展,总算不会觉得那么难过了。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
352 7
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
258 0
|
2月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
389 4
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
290 0
|
2月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
204 0
|
3月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
141 4
|
3月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
318 0
|
4月前
|
存储 安全 数据处理
Python 内置模块 collections 详解
`collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。
356 0
|
5月前
|
数据安全/隐私保护 Python
抖音私信脚本app,协议私信群发工具,抖音python私信模块
这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录
|
8月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
364 14

推荐镜像

更多