Python logging模块基础与进阶配置指南

小鹿同学
小鹿同学
发布时间:2026-10-11| 4人浏览过
原创

本文深入解析Python标准库logging模块的核心用法。涵盖日志级别(DEBUG至CRITICAL)的判定机制,利用basicConfig快速配置输出格式与文件写入,以及通过Logger、Handler和Formatter构建多目标日志系统。重点介绍RotatingFileHandler实现日志文件自动轮转与备份的策略,帮助开发者建立规范的日志记录体系。

日志级别与基础输出

Python内置的 logging 模块提供了标准的日志记录接口。系统预定义了五种日志级别,按严重程度从低到高依次为:DEBUG、INFO、WARNING、ERROR 和 CRITICAL。与这些级别对应的便捷函数分别为 debug()、info()、warning()、error() 和 critical()。

默认情况下,logging模块的日志级别被设定为 WARNING。这意味着只有级别等于或高于 WARNING 的消息才会被记录并输出,低于该级别的日志(如 DEBUG 或 INFO)将被自动忽略。例如,在交互环境中执行以下代码:

>>> import logging
>>> logging.debug("ni hao")
>>> logging.info("ni hao2")
>>> logging.warning("ni hao")
WARNING:root:ni hao
>>> logging.error("ni hao")
ERROR:root:ni hao
>>> logging.critical("ni hao")
CRITICAL:root:ni hao

上述示例显示,前两条消息未产生输出,而 warning 及以上级别的日志则按格式打印在标准错误流中。

使用 basicConfig 快速配置

对于简单的日志需求,可以使用 logging.basicConfig() 函数进行全局配置。该函数允许定义日志级别、输出格式、时间格式以及文件写入模式等关键参数。

1. 调整日志级别

通过设置 level 参数,可以控制哪些级别的日志会被记录。默认值为 logging.WARNING。若需记录更详细的信息,可将其调整为 logging.DEBUG 或 logging.INFO。

>>> import logging
>>> logging.basicConfig(level=logging.INFO)
>>> logging.info("nihao")
INFO:root:nihao
>>> logging.debug("dfasl")  # 低于INFO级别,不输出
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.info(4)
INFO:root:4

2. 配置日志格式与文件输出

basicConfig 支持通过 format 参数指定日志内容的详细程度。常用的格式占位符包括:

  • %(levelno)s:日志级别的数值。
  • %(levelname)s:日志级别的名称(如 WARNING)。
  • %(pathname)s:当前执行程序的全路径。
  • %(filename)s:当前程序的文件名。
  • %(funcName)s:调用日志函数的当前函数名。
  • %(lineno)d:日志语句所在的行号。
  • %(asctime)s:日志生成的时间,格式由 datefmt 指定。
  • %(thread)d 与 %(threadName)s:线程ID与名称。
  • %(process)d:进程ID。
  • %(message)s:实际的日志消息内容。

同时,可以通过 filename 参数指定日志写入的文件名,并通过 filemode 指定打开模式('w' 覆盖或 'a' 追加)。需要注意的是,如果同时指定了 stream 和 filename,stream 参数将被忽略。

以下示例演示了如何将日志写入指定文件,并自定义时间格式与内容格式:

import logging
log_format = '%(filename)s %(funcName)s %(asctime)s %(message)s'
log_filename = "logging_test.log"
logging.basicConfig(filename=log_filename, format=log_format, datefmt='%Y-%m-%d %H:%M:%S:%S %p', filemode='w', level=logging.INFO)
logging.warning("warning###########")
logging.warning("error@@@@@@@@@@@@@@")
logging.error("error~~~~~~~~~~~~~~~~")

构建灵活的日志系统:Logger、Handler与Formatter

当需要更精细的控制,例如同时输出到控制台和文件,或者对不同模块使用不同的日志策略时,应直接使用 Logger 对象。一个完整的日志记录流程通常涉及三个核心组件:Logger(负责记录)、Handler(负责分发)和 Formatter(负责格式化)。

1. 创建 Logger 实例

通过 logging.getLogger() 获取日志记录器对象,并设置其最低日志级别。默认情况下,Logger 的级别为 NOTSET,实际生效级别取决于其 Handler 的设置。

2. 配置 Handler

Handler 对象决定日志消息的去向。常见的 Handler 包括:

  • StreamHandler:将日志输出到标准流(如控制台)。
  • FileHandler:将日志写入文件。

可以为 Logger 添加多个 Handler,从而实现日志的多路分发。

3. 应用 Formatter

Formatter 定义日志的具体输出格式。每个 Handler 都可以关联一个 Formatter,以控制该输出源显示的字段。

以下代码展示了如何配置一个同时输出到控制台和文件的 Logger:

#coding: utf-8
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh = logging.FileHandler("test.log")
ch = logging.StreamHandler()
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh)    # 添加文件处理器
logger.addHandler(ch)    # 添加控制台处理器
logger.error("error$$$$$$$$$$")
logger.debug("aaaaa**********")

在此配置中,DEBUG 级别以上的日志将同时出现在控制台和 test.log 文件中。

日志文件轮转:RotatingFileHandler

在生产环境中,日志文件可能会无限增长,导致磁盘空间耗尽。为解决此问题,可以使用 logging.handlers.RotatingFileHandler 类。该类在日志文件大小达到指定阈值时,自动关闭当前文件并重命名备份,然后创建一个新的日志文件继续记录。

关键参数

  • maxBytes:指定日志文件的最大字节数。当文件达到此大小时触发轮转。若设置为 0,则文件可无限大,且不发生轮转。
  • backupCount:指定保留的备份文件数量。例如,若 backupCount=2,则系统最多保留两个备份文件(如 log.1, log.2)。当轮转发生时,旧的备份会被删除以维持数量限制。

实现示例

以下代码演示了如何初始化一个支持日志轮转的 Logger。该实现首先确保日志目录存在,然后配置控制台输出和文件轮转输出:

#! /usr/bin/env python
# --*-- coding:utf-8 --*--
import os
import logging
import logging.handlers

def init_log(LOGGER, log_file_path):
  # 设置Logger级别
  LOGGER.setLevel(logging.INFO)
  
  # 配置控制台输出
  ch = logging.StreamHandler()
  ch.setLevel(logging.INFO)
  formatter = logging.Formatter("%(asctime)s %(levelname)s %(filename)s(%(lineno)d) %(message)s ", "%Y-%m-%d %H:%M:%S")
  ch.setFormatter(formatter)
  LOGGER.addHandler(ch)
  
  # 确保日志目录存在
  log_dir = os.path.dirname(log_file_path)
  if not os.path.isdir(log_dir):
    os.makedirs(log_dir)
  
  # 配置文件轮转输出
  # maxBytes=10*1024*1024 (10MB), backupCount=9 (保留9个备份)
  fh = logging.handlers.RotatingFileHandler(log_file_path, maxBytes=10*1024*1024, backupCount=9)
  fh.setLevel(logging.INFO)
  fh.setFormatter(formatter)
  LOGGER.addHandler(fh)

if __name__=="__main__":
  print "Unsupported in main module..."

通过上述配置,日志文件在达到 10MB 时会自动轮转,并保留最近的 9 个备份文件,从而有效管理磁盘空间。

总结

Python 的 logging 模块提供了从简单到复杂的完整日志解决方案。对于快速调试,basicConfig 足以满足需求;对于复杂应用,通过组合 Logger、Handler 和 Formatter,可以实现灵活的多目标日志输出。结合 RotatingFileHandler,则可以确保日志系统在长期运行中的稳定性和可维护性。

以上就是Python日志模块logging基本用法的详细内容,更多关于Python日志配置的资料请关注本站其它相关文章!

相关标签:

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

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 算法库。