Python logging模块详解:日志级别、输出配置与实战示例

周末不加班
周末不加班
发布时间:2026-10-14| 4人浏览过
原创

本文深入解析Python内置logging模块,涵盖debug至critical五种日志级别的使用场景与数值定义。通过基础配置、文件保存、Handler处理及Formatter格式化等示例,演示如何灵活控制日志输出至控制台或文件,实现日志的双向记录与高级定制。

前言

日志是记录软件执行事件的重要追踪方式。在日常开发与调试中,通过查看日志可以高效分析并定位代码错误与问题。虽然新手常使用print语句进行简单打印,但其结果仅显示在控制台,缺乏持久化与分级管理能力。本文将介绍Python中功能更强大的日志记录模块logging,帮助开发者实现更专业的日志管理。

logging模块提供了一系列核心函数,包括debug()、info()、warning()、error()和critical(),分别对应不同的日志严重等级。

这些函数各自适用于不同的业务场景,具体对应关系可参考下表。

你想要执行的任务 此任务的最好的工具
对于命令行或程序的应用,结果显示在控制台。 print()
在对程序的普通操作发生时提交事件报告(比如:状态监控和错误调查) logging.info() 函数(当有诊断目的需要详细输出信息时使用 logging.debug() 函数)
提出一个警告信息基于一个特殊的运行时事件 warnings.warn()位于代码库中,该事件是可以避免的,需要修改客户端应用以消除告警logging.warning() 不需要修改客户端应用,但是该事件还是需要引起关注
对一个特殊的运行时事件报告错误 引发异常
报告错误而不引发异常(如在长时间运行中的服务端进程的错误处理) logging.error(), logging.exception() 或 logging.critical()分别适用于特定的错误及应用领域

日志功能根据事件的性质和严重性进行分级处理,确保不同级别的信息能被恰当捕获和处理。

名称 何时使用 等级
DEBUG 细节信息,仅当诊断问题时适用。 10
INFO 确认程序按预期运行 20
WARNING 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行 30
ERROR 由于严重的问题,程序的某些功能已经不能正常执行 40
CRITICAL 严重的错误,表明程序已不能继续执行 50

示例

简单示例

由于logging是Python标准库的一部分,无需额外安装。默认情况下,日志级别设置为WARNING,因此以下示例仅会显示一条warning级别的信息,低于该级别的debug和info消息将被忽略。


import logging
logging.warning('this is warning')
logging.info('this is info')

更改级别

若需查看更详细的调试信息,可将默认级别调整为最低级别(如DEBUG)。此时,系统将打印同级别以及所有更高级别的日志信息,便于全面排查问题。


import logging 
logging.basicConfig(level=logging.DEBUG)
logging.debug('this is debug')
logging.info('this is info')
logging.warning('this is warning')
logging.error('this is error')

保存日志

仅将日志打印到控制台在信息量较少时尚可管理,但当日志数据庞大时,查找特定信息将变得极为困难。因此,通常需要将日志保存到文件中,以便长期存储和后续分析。


import logging 
logging.basicConfig(level=logging.DEBUG,filename='log.log',format='%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.debug('this is debug')
logger.info('this is info')
logger.warning('this is warning')
logger.error('this is error')

在保存日志时,除了基础内容外,还可以添加丰富的描述信息,例如执行时间、代码行数、日志级别以及具体的打印消息。实现这些功能的方法多样,具体格式配置可参考下表。

属性名称 格式 描述
ARGS 你不需要自己设置格式。 参数元组被合并到msg中以产生消息,或者其值被用于合并的词典(当只有一个参数时,它是一个字典)。
asctime %(asctime)类 创建时的可读时间。默认情况下,这是'2003-07-08 16:49:45,896'的格式(逗号之后的数字是毫秒部分)。
created %(created)的F 创建的时间(由time.time()返回)。
exc_info 你不需要自己设置格式。 异常元组(àla sys.exc_info)或,如果没有发生异常,则为无。
filename %(filename)类 路径名的文件名部分。
funcName %(funcName)类 包含日志记录调用的函数的名称。
levelname %(levelname)■ 文本消息级别('DEBUG','INFO','WARNING','ERROR','CRITICAL')。
levelno %(levelno)s 消息的数字记录级别(DEBUG,INFO,WARNING,ERROR,CRITICAL)。
lineno %(lineno)d 发出日志记录调用的源行号。
module %(module)类 模块(文件名称部分)。
msecs %(msecs)d 创建时的毫秒部分。
message %(message)类 记录的消息,计算为msg%args。这是在调用Formatter.format()时设置的。
msg 你不需要自己设置格式。 在原始日志记录调用中传递的格式字符串。与args合并生成消息或任意对象(请参阅使用任意对象作为消息)。
name %(name)类 用于记录呼叫的记录器的名称。
pathname %(filename)类 发出日志记录调用的源文件的完整路径名。
process %(process)d 进程ID。
processName %(processName)类 进程名称。
relativeCreated %(relativeCreated)d 相对于加载日志记录模块的时间,LogRecord创建时的时间(以毫秒为单位)。
thread %(thread)d 线程ID。
threadName %(threadName)类 线程名称。

日志输出进阶

首先,我们需要了解几个关键的进阶配置方法及其作用。

StreamHandler类位于核心logging包中,它负责将日志记录输出发送到数据流,例如sys.stdout、sys.stderr或任何支持write()和flush()方法的文件类对象。

FileHandler类同样位于核心logging包中,它将日志记录输出保存到磁盘文件中。该类继承了StreamHandler的输出功能,专门用于文件持久化存储。

在实际使用中,我们需要通过调用Logger类(通常称为loggers或记录器)的实例来执行具体的日志记录操作。

Logger对象提供了三个常用且重要的方法,用于配置日志行为。

  • Logger.setLevel()用于指定记录器将处理的最低严重性日志消息。其中,debug是最低的内置严重性级别,critical是最高级别。例如,若将级别设置为INFO,则记录器仅处理INFO、WARNING、ERROR和CRITICAL消息,而忽略所有DEBUG消息。
  • Logger.addHandler()和Logger.removeHandler()用于从记录器对象中添加或删除处理程序对象。处理程序的具体实现细节在相关文档中有更详细的介绍。
  • Logger.addFilter()和Logger.removeFilter()允许添加或移除记录器对象中的过滤器。Filter对象提供了更精细的日志过滤细节,可根据特定条件筛选日志。

以下示例展示了如何添加日志记录器对象,其输出效果与之前直接在控制台打印相同,但通过Handler机制实现了更灵活的控制。


import logging
 
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
 
logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

同样地,我们也可以将日志保存到文件中。为了演示方便,此处将输出文件名修改为put.log,确保日志内容被持久化存储。


import logging
 
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
handler = logging.FileHandler('put.log')
formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
 
 
logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

日志双向输出


import logging

logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
handler1 = logging.FileHandler('output.log')
handler2 = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')
handler1.setFormatter(formatter)
handler2.setFormatter(formatter)
logger.addHandler(handler1)
logger.addHandler(handler2)

logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

以上就是Python日志模块logging的使用场景及示例的详细内容,更多关于Python日志模块logging的使用的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。