Python logging模块handlers用法详解
本文深入解析Python logging模块中handlers的核心用法,涵盖StreamHandler控制台输出、FileHandler文件记录及TimedRotatingFileHandler日志自动分割。详细讲解构造函数参数when、interval与backupCount的配置逻辑,结合完整代码示例演示如何自定义日志格式与级别,帮助开发者高效管理应用日志生命周期。
handlers概述
一、handlers是什么?
logging模块中包含的类
用来自定义日志对象的规则(比如:设置日志输出格式、等级等)
常用3个子类:StreamHandler、FileHandler、TimedRotatingFileHandler
handlers基础应用
二、handlers基础应用
StreamHandler控制台输出
2.1 StreamHandler 控制台输出日志
import logging
#创建一个logger日志对象
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG) #设置默认的日志级别
#创建日志格式对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#创建StreamHandler对象
sh = logging.StreamHandler()
#StreamHandler对象自定义日志级别
sh.setLevel(logging.DEBUG)
#StreamHandler对象自定义日志格式
sh.setFormatter(formatter)
logger.addHandler(sh) #logger日志对象加载StreamHandler对象
#日志输出
logger.info('newdream')
运行上述代码后,系统将在控制台终端打印出相应的日志信息。
FileHandler文件记录
2.2 FileHandler 日志输出到文件
import logging
#创建一个logger日志对象
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG) #设置默认的日志级别
#创建日志格式对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#创建FileHandler对象
fh = logging.FileHandler('test.log')
#FileHandler对象自定义日志级别
fh.setLevel(logging.DEBUG)
#FileHandler对象自定义日志格式
fh.setFormatter(formatter)
logger.addHandler(fh) #logger日志对象加载FileHandler对象
#日志输出
logger.info('newdream')
执行该段代码时,控制台将不再显示日志内容,而是自动在当前工作目录下生成一个名为test.log的文件,所有日志记录均写入该文件。
TimedRotatingFileHandler日志分割
2.3 TimedRotatingFileHandler 日志分割
import logging
from logging import handlers
#创建一个logger日志对象
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG) #设置默认的日志级别
#创建日志格式对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#创建TimedRotatingFileHandler对象
rh = handlers.TimedRotatingFileHandler("test.log", when='S', interval=1, backupCount=5)
#TimedRotatingFileHandler对象自定义日志级别
rh.setLevel(logging.DEBUG)
#TimedRotatingFileHandler对象自定义日志级别
rh.suffix = "%Y_%m_%d_%H_%M_%S.log"
#TimedRotatingFileHandler对象自定义日志格式
rh.setFormatter(formatter)
logger.addHandler(rh) #logger日志对象加载TimedRotatingFileHandler对象
#日志输出
logger.info('newdream')
运行此代码后,控制台无输出,程序会在当前目录创建一个以时间戳命名的日志文件(格式为test_年_月_日_时_分_秒.log)进行日志存储。
在实例化TimedRotatingFileHandler时,需遵循如下构造函数定义:
- TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
- filename:指定输出日志文件名的前缀,例如log/myapp.log。
- when:定义按何种时间单位进行切分,该参数接收特定的字符串值,可选值包括:
“S”: Seconds “M”: Minutes “H”: Hours “D”: Days “W”: Week day (0=Monday) “midnight”: Roll over at midnight
interval参数表示等待多少个when单位的时间后,Logger会自动重建新文件。新文件的命名由filename加上suffix组成。若新生成的文件名与已有文件重名,系统将自动覆盖旧文件,因此建议明确定义suffix以避免因when参数导致的文件名重复冲突。backupCount用于设定保留的日志文件数量。默认值为0,表示不自动删除任何日志。若设置为5,则在创建新文件时,库会检查现有日志数量,若超过5个,则从最早创建的日志开始删除,直至保留数量符合设定。
总结
三、小结
上述日志示例为了便于读者清晰操作和理解,将代码分开单独实现。
在2.3节中,若想验证是否达到5个日志后自动删除的效果,可以通过循环输出日志来实现,代码如下:
while True: logger.info('newdream')
三种handlers日志可以共同使用,它们都是独立的handler对象,但一般FileHandler和TimedRotatingFileHandler不会同时使用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









