Python logging模块基础与进阶配置指南
本文深入解析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日志配置的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













