文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器各参数详细介绍

2023-09-21 18:34

关注

文章目录

在python的logging.handlers模块中,提供了很多有用的日志处理程序对象,其中比较常用的有:RotatingFileHandlerTimedRotatingFileHandler。这两个处理程序主要是用来对输出的日志文件进行切割。

一、RotatingFileHandler 介绍

RotatingFileHandler 是 Python 自带的日志处理器之一,用于将日志写入到指定的文件中,并控制文件大小和数量,可实现日志轮转(即备份旧日志并创建新的日志)。

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)

RotatingFileHandler 的各参数解释:

  1. filename:文件名,指定日志文件的路径和名称;
  2. mode:模式,可选值为 ‘a’ 或 ‘w’。当为 ‘a’ 时,表示以追加方式写入日志;当为 ‘w’ 时,表示以覆盖方式写入日志。默认值为 ‘a’;
  3. maxBytes:单个日志文件的最大大小,单位为字节。当日志文件达到该大小时,会自动备份旧日志并创建新的日志文件。默认值为 0,表示不限制日志文件大小。;
  4. backupCount:备份文件数目。当生成的日志文件数量超过该数目时,会自动删除旧的备份日志文件。默认值为 0,表示不备份;
  5. encoding:日志文件的编码格式,默认为 None,表示使用系统默认编码;
  6. delay:是否延时打开文件,可选值为 True 和 False。当为 True 时,表示延时打开文件,即在第一次写入日志时才打开日志文件。当为 False 时,表示在初始化时即打开日志文件。默认值为 False

默认情况下,文件无限增长。您可以指定maxBytesbackupCount的特定值,以允许文件以预定的大小滚动。

需要注意的是,如果指定了为maxBytes指定了>0的值,则mode指定为w是没有意义的,RotatingFileHandler初始化时会自动将mode强制改为a

示例1:

import loggingfrom logging.handlers import RotatingFileHandlerlogger = logging.getLogger('mylogger')logger.setLevel(logging.INFO)handler = RotatingFileHandler(filename='test.log', maxBytes=6, backupCount=3)logger.addHandler(handler)for i in range(10):    logger.info("Hello%d" % i)

输出4个日志文件,文件名及文件内容分别如下:

# test.logHello9# test.log.1Hello8# test.log.2Hello7# test.log.3Hello6

解释:

二、TimedRotatingFileHandler 介绍

TimedRotatingFileHandler 是 Python 自带的日志处理器之一,与 RotatingFileHandler 类似,也用于将日志写入到指定的文件中,并对文件进行切割。不同的是TimedRotatingFileHandler 可以按照时间轮转日志,例如每天或每小时生成一个新的日志文件。

class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)

TimedRotatingFileHandler 的各参数的详解:

  1. filename:文件名,指定日志文件的路径和名称;
  2. when:日志轮转的时间间隔,可选值为 ‘S’、‘M’、‘H’、‘D’、‘W’ 和 ‘midnight’,分别表示秒、分、时、天、周和每天的午夜;默认值为 ‘midnight’,即每天的午夜轮转,值不区分大小写;
  3. interval:时间间隔的数量,默认为 1;例如,当 when=‘D’ 且 interval=7 时,表示每周轮转一次;
  4. backupCount:备份文件数目;当生成的日志文件数量超过该数目时,会自动删除旧的备份日志文件;默认值为 0,表示不备份;
  5. encoding:日志文件的编码格式,默认为 None,表示使用系统默认编码;
  6. delay:是否延时打开文件,可选值为 True 和 False;当为 True 时,表示延时打开文件,即在第一次写入日志时才打开日志文件;当为 False 时,表示在初始化时即打开日志文件;默认值为 False;
  7. utc:是否使用 UTC 时间,默认为 False,表示使用本地时间
  8. atTime:用来设置轮转时间,格式为 ‘%H:%M:%S’,默认为午夜 12 点;需要注意的是该参数仅在whenW/midnight时有效;

当使用基于星期的轮换时,星期一为 ‘W0’,星期二为 ‘W1’,以此类推直至星期日为 ‘W6’。 在这种情况下,传入的 interval 值不会被使用。

示例1: 日志文件备份规则

import loggingfrom logging.handlers import TimedRotatingFileHandlerimport timelogger = logging.getLogger('mylogger')logger.setLevel(logging.INFO)handler = TimedRotatingFileHandler(    filename="./test.log",    when="S",    interval=3,    backupCount=5,    encoding="utf8")ffmt = logging.Formatter("%(asctime)s - %(message)s")handler.setFormatter(ffmt)logger.addHandler(handler)for i in range(10):    logger.info("Hello%d" % i)    logger.info(handler.suffix)    logger.info(handler.extMatch)    time.sleep(3)

输出文件:
示例1生成的日志文件

部分文件内容:

# test.log2023-08-17 22:06:45,635 - Hello92023-08-17 22:06:45,635 - %Y-%m-%d_%H-%M-%S2023-08-17 22:06:45,635 - re.compile('^\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}(\\.\\w+)?$', re.ASCII)# test.log.2023-08-17_22-06-302023-08-17 22:06:30,615 - Hello42023-08-17 22:06:30,615 - %Y-%m-%d_%H-%M-%S2023-08-17 22:06:30,615 - re.compile('^\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}(\\.\\w+)?$', re.ASCII)

解释:

示例2: 轮换时间的计算则仅在轮换发生时执行

还是示例1的代码,这里做一个小改动,将最后一行的time.sleep(3)改为`time.sleep(2)

将已有日志文件全删除,再次运行代码。

输出文件:
示例2生成的日志文件

部分文件内容:

# test.log2023-08-17 22:24:16,973 - Hello82023-08-17 22:24:16,973 - %Y-%m-%d_%H-%M-%S2023-08-17 22:24:16,973 - re.compile('^\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}(\\.\\w+)?$', re.ASCII)2023-08-17 22:24:18,984 - Hello92023-08-17 22:24:18,984 - %Y-%m-%d_%H-%M-%S2023-08-17 22:24:18,984 - re.compile('^\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}(\\.\\w+)?$', re.ASCII)# test.log.2023-08-17_22-24-122023-08-17 22:24:12,957 - Hello62023-08-17 22:24:12,957 - %Y-%m-%d_%H-%M-%S2023-08-17 22:24:12,957 - re.compile('^\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}(\\.\\w+)?$', re.ASCII)2023-08-17 22:24:14,960 - Hello72023-08-17 22:24:14,960 - %Y-%m-%d_%H-%M-%S2023-08-17 22:24:14,960 - re.compile('^\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}(\\.\\w+)?$', re.ASCII)

解释:

示例3: 自定义备份文件的后缀

import loggingfrom logging.handlers import TimedRotatingFileHandlerimport timeimport relogger = logging.getLogger('mylogger')logger.setLevel(logging.INFO)handler = TimedRotatingFileHandler(    filename="./test.log",    when="S",    interval=3,    backupCount=5,    encoding="utf8")ffmt = logging.Formatter("%(asctime)s - %(message)s")handler.setFormatter(ffmt)handler.suffix = "%Y%m%d_%H%M%S"+".log"extMatch = r"^\d{4}\d{2}\d{2}_\d{2}\d{2}\d{2}(\.\w+)?$"handler.extMatch = re.compile(extMatch, re.ASCII)logger.addHandler(handler)for i in range(10):    logger.info("Hello%d" % i)    time.sleep(5)

文件输出:
示例3生成的日志文件

解释:

示例4:
由于when='M''H''W0'~'W6'midnight 时,测试起来不太方便,我这里只解释规则,部分给出关键代码。

# when='M'时,suffix、extMatch默认值为handler.suffix = "%Y-%m-%d_%H-%M"extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$"handler.extMatch = re.compile(self.extMatch, re.ASCII)# when='H'时,suffix、extMatch默认值为handler.suffix = "%Y-%m-%d_%H"extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$"handler.extMatch = re.compile(self.extMatch, re.ASCII)# when='W'时,suffix、extMatch默认值为handler.suffix = "%Y-%m-%d"extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"handler.extMatch = re.compile(self.extMatch, re.ASCII)# when='midnight'时,suffix、extMatch默认值为handler.suffix = "%Y-%m-%d"extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"handler.extMatch = re.compile(self.extMatch, re.ASCII)
from logging.handlers import TimedRotatingFileHandlerfrom datetime import time# 每周五,早上 02:00:00 进行日志轮换handler = TimedRotatingFileHandler(filename, when='w4', atTime=time(02, 20, 00))
from logging.handlers import TimedRotatingFileHandlerfrom datetime import time# 每天,早上 10:00:00 进行日志轮换handler = TimedRotatingFileHandler(filename, when='midnight', atTime=time(10, 00, 00))


参考资料:
logging.handlers — 日志处理

来源地址:https://blog.csdn.net/B11050729/article/details/132353220

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯