追踪问题——用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 的日志记录工具.


总结


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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1天前
|
机器学习/深度学习 数据采集 算法
【Python 机器学习专栏】机器学习在医疗诊断中的前沿应用
【4月更文挑战第30天】本文探讨了机器学习在医疗诊断中的应用,强调其在处理复杂疾病和大量数据时的重要性。神经网络、决策树和支持向量机等方法用于医学影像诊断、疾病预测和基因数据分析。Python作为常用工具,简化了模型构建和数据分析。然而,数据质量、模型解释性和伦理法律问题构成挑战,需通过数据验证、可解释性研究及建立规范来应对。未来,机器学习将更深入地影响医疗诊断,带来智能和精准的诊断工具,同时也需跨学科合作推动其健康发展。
|
2天前
|
JSON 数据格式 Python
Python标准库中包含了json模块,可以帮助你轻松处理JSON数据
【4月更文挑战第30天】Python的json模块简化了JSON数据与Python对象之间的转换。使用`json.dumps()`可将字典转为JSON字符串,如`{"name": "John", "age": 30, "city": "New York"}`,而`json.loads()`则能将JSON字符串转回字典。通过`json.load()`从文件读取JSON数据,`json.dump()`则用于将数据写入文件。
8 1
|
3天前
|
Python 容器
python内置函数、数学模块、随机模块(二)
python内置函数、数学模块、随机模块(二)
|
3天前
|
索引 Python
python内置函数、数学模块、随机模块(一)
python内置函数、数学模块、随机模块(一)
|
6天前
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
122 5
|
6天前
|
人工智能 数据库 开发者
Python中的atexit模块:优雅地处理程序退出
Python中的atexit模块:优雅地处理程序退出
8 3
|
9天前
|
存储 开发者 Python
Python中的argparse模块:命令行参数解析的利器
Python中的argparse模块:命令行参数解析的利器
16 2
|
9天前
|
开发者 Python
Python的os模块详解
Python的os模块详解
16 0
|
12天前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
|
14天前
|
测试技术 Python
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘