Python 程序员必须掌握的日志记录
本文详解 Python 标准库 logging 模块的核心用法。从基础日志打印到高级配置,涵盖 Logger、Handler、Formatter 三大组件协作机制,演示 basicConfig 与文件配置两种方式,帮助开发者建立规范的日志记录习惯,提升系统调试与故障排查效率。
日志记录的重要性
前言
在现实场景中,「日志记录」具有极高的价值。例如银行转账流水、汽车行车记录仪对行驶过程的完整留存,均依赖日志来还原事实。当发生异常时,日志是追溯问题根源的关键依据。
在系统开发与调试环节,记录日志同样不可或缺。许多编程初学者常忽视日志记录,认为其可有可无,甚至仅依赖 print 函数输出中间结果。这种想法过于天真。对于简单脚本,print 或许可行;但在复杂系统中,大量无差别的打印输出会导致信息过载,即便逐行排查也难以快速定位有效信息。
「日志」是系统架构的核心组成部分,用于记录用户操作、系统运行状态及错误信息。日志质量直接决定故障定位效率:完善的日志体系能协助服务崩溃时快速定位问题源头,同时通过日志分析可提前预警潜在风险。
Python 标准日志模块基础
Python 的标准日志模块
鉴于日志的重要性,Python 标准库提供了 logging 模块。基础使用中,日志默认输出至终端屏幕。开发者可直接导入该模块,调用 debug、info、warn、error 和 critical 等方法记录日志。默认日志级别为 warning,仅显示级别高于或等于 warning 的日志(critical > error > warning > info > debug)。「级别」是逻辑概念,用于区分日志的重要程度。
import logging
logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')
上述代码的执行结果如下所示:
WARNING:root:warn message ERROR:root:error message CRITICAL:root:critical message
前文提到,print 会产生海量信息,难以筛选有效内容。而 logging 通过分级机制,允许我们仅保存高优先级日志,从而提升日志性能与分析效率。这使得从庞大日志文件中快速定位错误成为可能。
配置日志格式与核心组件
配置日志格式
在使用 logging 记录日志前,需进行基础配置:
import logging
logging.basicConfig(filename= 'test.log', level= logging.INFO)
logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')
上述示例使用 basicConfig 进行了简单配置。实际上,logging 支持更复杂的配置方式。在此之前,需了解 logging 中的三个核心概念:
- Logger:日志记录器,是应用程序中可直接调用的接口。
- Handler:日志处理器,决定日志保存位置及留存时间。
- Formatter:格式化器,配置日志输出的具体格式。
三者关系为:一个 Logger 关联一个 Handler,一个 Handler 关联一个 Formatter。配置方式上,简单场景可使用 basicConfig;复杂场景建议将配置写入独立文件,并通过 fileConfig 在主程序中读取。
掌握基础知识后,尝试完成一个小练习:配置日志文件保存所有 debug 及以上级别的日志,每条日志需包含打印时间、日志级别及内容。请先自行思考,确认思路后继续:
import logging
logging.basicConfig(
level= logging.DEBUG,
format = '%(asctime)s : %(levelname)s : %(message)s',
filename= "test.log"
)
logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')
上述代码的一次运行结果如下:
2018-10-19 22:50:35,225 : DEBUG : debug message 2018-10-19 22:50:35,225 : INFO : info message 2018-10-19 22:50:35,225 : WARNING : warn message 2018-10-19 22:50:35,225 : ERROR : error message 2018-10-19 22:50:35,225 : CRITICAL : critical message
使用配置文件管理日志
前文提及,复杂配置可将日志设置保存至配置文件,主程序通过 fileConfig 加载。以下是一个典型的日志配置文件示例(文件名 logging.conf):
[loggers]
keys = root
[handlers]
keys = logfile
[formatters]
keys = generic
[logger_root]
handlers = logfile
[handler_logfile]
class = handlers.TimedRotatingFileHandler
args = ('test.log', 'midnight', 1, 10)
level = DEBUG
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s
在该配置文件中,[loggers] 声明了一个名为 root 的日志记录器(logger);[handlers] 声明了一个名为 logfile 的日志处理器(handler);[formatters] 声明了一个名为 generic 的格式化器(formatter)。随后,[logger_root] 定义了 root 记录器使用的处理器;[handler_logfile] 定义了日志输出方式及文件切换策略(如按天滚动);[formatter_generic] 则定义了日志格式,包含产生时间、级别、文件名及行号等信息。
有了上述配置文件,即可在主代码中使用 logging.config 模块的 fileConfig 函数加载配置:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')
上述代码的运行一次的结果如下所示:
2018-10-19 23:00:02,809 WARNI [root:8] warn message 2018-10-19 23:00:02,809 ERROR [root:9] error message 2018-10-19 23:00:02,809 CRITI [root:10] critical message
结语
正如此前标题所述,「日志记录」是每个 Python 程序员必须掌握且具备意识的能力。若你此前未使用过日志,或不知如何规范使用,本文希望能为你提供切实帮助。
Python 日志库设计精良且灵活,堪称标准库中的优秀典范。前文仅展示了其极少部分功能,更多高级操作与内容需在后续学习与实践中进一步探索。
The end。
以上就是Python 程序员必须掌握的日志记录的详细内容,更多关于python 日志的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









