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

这篇具有很好参考价值的文章主要介绍了Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器各参数详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在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 logging
from logging.handlers import RotatingFileHandler

logger = 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.log
Hello9

# test.log.1
Hello8

# test.log.2
Hello7

# test.log.3
Hello6

解释:

  • 文件最新内容始终输出在test.log基本日志文件中;
  • test.log大小达到设定的maxBytes时,如果再有日志写入,则新生成一个test.log,并将原来的test.log重命名为test.log.1,将原来的test.log.1(如果有)重命名为test.log.2,将原来的test.log.2(如果有)重命名为test.log.3,将原来的test.log.3(如果有)删除(因为只备份3个)

二、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 logging
from logging.handlers import TimedRotatingFileHandler
import time

logger = 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)

输出文件:
logging.handlers.rotatingfilehandler,Python,python

部分文件内容:

# test.log
2023-08-17 22:06:45,635 - Hello9
2023-08-17 22:06:45,635 - %Y-%m-%d_%H-%M-%S
2023-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-30
2023-08-17 22:06:30,615 - Hello4
2023-08-17 22:06:30,615 - %Y-%m-%d_%H-%M-%S
2023-08-17 22:06:30,615 - re.compile('^\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}(\\.\\w+)?$', re.ASCII)

解释:

  • 代码中,when='S'interval=3,表示每3s备份一次文件,backupCount=5,表示最多保留5份旧日志数据;
  • 从输出结果来看,每3s备份一次数据,只保留5份旧的数据,符合预期;
  • 另外,按秒切割的日志文件,备份文件是在原日志文件名后添加.%Y-%m-%d_%H-%M-%S的后缀,而删除旧日志文件使用的正则表达式为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)

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

输出文件:
logging.handlers.rotatingfilehandler,Python,python

部分文件内容:

# test.log
2023-08-17 22:24:16,973 - Hello8
2023-08-17 22:24:16,973 - %Y-%m-%d_%H-%M-%S
2023-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 - Hello9
2023-08-17 22:24:18,984 - %Y-%m-%d_%H-%M-%S
2023-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-12
2023-08-17 22:24:12,957 - Hello6
2023-08-17 22:24:12,957 - %Y-%m-%d_%H-%M-%S
2023-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 - Hello7
2023-08-17 22:24:14,960 - %Y-%m-%d_%H-%M-%S
2023-08-17 22:24:14,960 - re.compile('^\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}(\\.\\w+)?$', re.ASCII)

解释:

  • 示例1结果不同的是,备份的日志文件名后添加的后缀时间间隔是4,不是interval=3设置的间隔。这是因为:初始轮换时间的计算是在处理程序被初始化时执行的。 后续轮换时间的计算则仅在轮换发生时执行,而只有当提交输出时轮换才会发生。

    例如,如果设置时间间隔为“每分钟”,那并不意味着你总会看到(文件名中)带有间隔一分钟时间的日志文件;如果在应用程序执行期间,日志记录输出的生成频率高于每分钟一次,那么你可以预期看到间隔一分钟时间的日志文件。 但如果日志记录消息每五分钟才输出一次,那么你将看到的是间隔五分钟时间的日志文件。

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

import logging
from logging.handlers import TimedRotatingFileHandler
import time
import re

logger = 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)

文件输出:
logging.handlers.rotatingfilehandler,Python,python

解释:

  • 使用 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)重新定义了删除旧备份文件使用的正则表达式,以保证新后缀的旧的备份文件能正常按备份数量进行删除。

示例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)
  • when='M'interval=1时,表示日志按分钟进行切割,但需要注意的是下次轮换时间是:处理器初始化时间+60s,比如:日志处理器初始化是在10:00:25,那么下次备份文件的生成是在10:01:25,而不是10:01:00(当然前提是10:01:25这个时间有日志提交,如果这个时间没日志提交,那么备份文件的生成时间为这个时间之后日志首次提交的时间)
  • when='M'interval=1时,表示日志按每小时进行切割,但同样需要注意下次轮换时间是:处理器初始化时间+60*60s,比如:日志处理器初始化是在10:20:30,那么下次备份文件生成是在11:20:30(当然前提是11:20:30这个时间有日志提交,如果这个时间没日志提交,那么备份文件的生成时间为这个时间之后日志首次提交的时间)
  • when='w2'时,如果不指定atTime,则意思为每周三,午夜12点进行日志轮转,即 周四 00:00:00 进行日志轮转;
  • when='w3'时,如果指定了atTime,如 atTime=datetime.time(22,00,00),表示每周四,晚上22:00:00 进行日志轮转;
from logging.handlers import TimedRotatingFileHandler
from datetime import time

# 每周五,早上 02:00:00 进行日志轮换
handler = TimedRotatingFileHandler(filename, when='w4', atTime=time(02, 20, 00))
  • when='midnight'时,如果未指定atTime,则意思为每天午夜12点进行日志轮转;
  • when='midnight'时,如果指定了atTime,如atTime=datetime.time(23,00,00),则意思为每天晚上23:00:00,进行日志轮转;
from logging.handlers import TimedRotatingFileHandler
from datetime import time

# 每天,早上 10:00:00 进行日志轮换
handler = TimedRotatingFileHandler(filename, when='midnight', atTime=time(10, 00, 00))


参考资料:
logging.handlers — 日志处理文章来源地址https://www.toymoban.com/news/detail-705617.html

到了这里,关于Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器各参数详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang 结构化日志包 log/slog 详解(二):Handler

    上一篇文章介绍了推出 log/slog 包的背景、log/slog 包的简单介绍和使用,简单使用了 Info 函数,例如: 这段代码输出的内容如下: 默认情况下,输出的日志格式是普通的 text 格式,这种格式并不是最适合日志系统的格式。日志系统一般采用 SON 格式或者 key=value 类型的文本格式

    2024年02月09日
    浏览(36)
  • Python模块之logging和colorlog

    使用logging和colorlog实现日志记录可以方便地记录程序的运行情况,方便调试和分析问题。下面将详细说明如何使用logging和colorlog,并提供相应的代码示例。 首先需要安装colorlog模块。可以通过pip命令进行安装: logging模块是Python自带的日志记录模块。logging模块提供了非常灵活

    2024年02月10日
    浏览(58)
  • python 常用内置模块之 logging(日志输出)

    Python logging 模块定义了为应用程序和库实现灵活的事件日志记录的函数和类,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket 等,甚至可以自定义实现具体的日志记录方式。 Logging 优点

    2024年02月05日
    浏览(45)
  • Python logging模块的基本使用、进阶使用详解

    在 python3 中,内置了 logging 模块,用于进行日志相关的处理。 这篇文章将总结 logging 模块的基本用法及进阶用法 1. 日志级别及对应函数 logging模块默认定义了6个日志级别: 日志优先级: CRIRICAL ERROR WARNING INFO DEBUG 当日志级别设置为某个级别时,则低于该级别的日志将不输出

    2024年01月25日
    浏览(46)
  • [python]使用标准库logging实现多进程安全的日志模块

    原本应用的日志是全部输出到os的stdout,也就是控制台输出。因其它团队要求也要保留日志文件,便于他们用其他工具统一采集,另一方面还要保留控制台输出,便于出问题的时候自己直接看pod日志。具体需求如下: 日志支持同时控制台输出和文件输出 控制台的输出级别可以

    2024年01月23日
    浏览(29)
  • chatgpt赋能python:Python输出方法详解:从基础print()到高级logging模块

    在Python编程中,输出是一个必不可少的步骤。然而,Python提供了多种输出方法,如何选择最适合的方法呢?本文将详细介绍Python输出的不同方法,并给出实际应用场景的示例。 最基础的输出方法就是使用内置函数 print() 。它可以接收多个参数,并将它们以空格分隔输出到控制

    2024年02月08日
    浏览(52)
  • Ansible Handlers模块详解,深入理解Ansible Handlers 自动化中的关键组件

    在现代的IT环境中,自动化已经成为提高效率和减少错误的关键。Ansible作为一款流行的自动化工具,通过使用Playbooks来定义和执行任务。而Handlers作为Ansible的组件之一,在自动化过程中发挥着重要的作用。本文将深入探讨Handlers的概念、作用和使用方法,帮助读者更好地理解

    2024年02月14日
    浏览(29)
  • PostgreSQL Log 日志模块详解

    本文讲的是操作日志,非 WAL 日志。 PG 的日志模块是一个相对独立的模块,主要功能就是打印用户的操作日志以及一些异常报错信息。本文仅讲述 logging_collector 参数开启的情况。 PG 有各种各样的进程,其中 syslogger 进程专门用于打印日志信息。 而其余进程打印日志的方法如

    2024年02月11日
    浏览(32)
  • logging 模块因权限问题写入日志失败

    哈喽大家好,我是咸鱼 今天跟大家分享一个使用 Python 的 logging 模块写入日志文件时遇到的权限问题,不知道你们有没有遇到过 今天上班的时候手机短信收到了 zabbix 告警,但是发现了不对劲的地方:微信没有收到告警信息,按理说短信跟微信应该是同时收到告警信息的 咸鱼

    2024年02月07日
    浏览(30)
  • PostgreSQL 技术内幕(十)WAL log 模块基本原理

    事务日志是数据库的重要组成部分,记录了数据库系统中所有更改和操作的历史信息。 WAL log(Write Ahead Logging)也被称为xlog,是事务日志的一种,也是关系数据库系统中用于 保证数据一致性和事务完整性 的一系列技术,在数据库 恢复、高可用、流复制、逻辑复制 等模块中扮

    2024年02月07日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包