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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 追踪问题——用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 的日志记录工具.


总结


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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
22天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
41 4
|
2天前
|
Python
Python Internet 模块
Python Internet 模块。
99 74
|
20天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
102 63
|
21天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
21天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
27天前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
24天前
|
监控 开发者 Python
Python 默认 `logging` 打印级别详解
本文详细介绍了 Python `logging` 模块的默认打印级别及其配置方法。`logging` 模块支持 `DEBUG`、`INFO`、`WARNING`、`ERROR` 和 `CRITICAL` 五个日志级别,默认级别为 `WARNING`。文章通过示例代码展示了如何设置和使用不同日志级别,并介绍了进一步的配置选项,如日志格式和文件输出。
47 8
|
22天前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
33 5
|
21天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
43 5