Log日志生成太多?自动分开存储吧!python logging

背景

最近在开发过程中,需要对日志进行保存,然而日志存着存着就会超级大,一个txt文件半天打不开,恼火至极,所以对日志保存进行自动开新日志的操作

详解

主要是使用了 logging.handlers 库中的 RotatingFileHandler  函数。

RotatingFileHandler 详解

一、定义与用途

RotatingFileHandler 是 Python 标准库中 logging.handlers 模块的一个类,用于实现日志文件的滚动和管理。在软件开发中,日志记录是非常重要的部分,它可以帮助开发者追踪代码的执行过程、排查错误和了解系统的运行情况。然而,随着时间的推移,日志文件可能会变得非常庞大,处理起来变得困难,甚至可能占用大量的磁盘空间。RotatingFileHandler 正是为了解决这一问题而设计的,它能够根据文件大小或时间自动创建新的日志文件,并删除旧的日志文件,从而保持日志文件的大小和数量在可控范围内。

二、参数说明

RotatingFileHandler 的构造函数接受多个参数,用于控制其行为:

  • filename:日志文件的名称,可以包含路径信息。如果指定的文件不存在,则会自动创建。
  • mode:日志文件的打开模式,默认为 'a',即追加模式。如果选择其他模式,如 'w',则每次启动程序时都会覆盖原有文件。
  • maxBytes:单个日志文件的最大大小(以字节为单位),超过这个大小就会触发轮转(即创建新文件)。默认为 0,表示不限制文件大小。
  • backupCount:保留的备份日志文件个数。当轮转发生时,如果备份文件个数超过这个值,最老的备份文件会被删除。默认为 0,表示不保留备份文件。
  • encoding:文件的编码格式,默认为 None,表示使用系统默认编码。
  • delay:是否延迟打开文件,直到第一次写入日志时再打开。默认为 False,即立即打开文件。

三、工作原理

RotatingFileHandler 的工作原理相对简单。当日志文件的大小达到 maxBytes 指定的阈值时,RotatingFileHandler 会自动关闭当前日志文件,并将其重命名为带有扩展名(如 .1.2 等)的备份文件。然后,它会创建一个新的日志文件用于继续记录日志。如果备份文件的数量超过了 backupCount 指定的值,最老的备份文件将被删除,以释放磁盘空间。

四、使用场景

RotatingFileHandler 适用于需要长时间运行且日志量较大的应用程序。通过合理使用 maxBytes 和 backupCount 参数,开发者可以控制日志文件的大小和数量,从而避免日志文件过大导致的问题。

五、注意事项

  • 在使用 RotatingFileHandler 时,需要确保应用程序有权限在指定路径下创建和删除文件。
  • 如果 maxBytes 设置为 0,则 RotatingFileHandler 不会触发轮转,日志文件将无限增长。
  • 如果 backupCount 设置为 0,则 RotatingFileHandler 不会保留任何备份文件,每次轮转时都会直接覆盖原有文件(如果 mode 不是 'w' 的话)。
  • 在某些情况下,如果日志文件被外部程序删除或移动,RotatingFileHandler 可能无法正确识别并处理这种情况。为了解决这个问题,可以考虑使用 WatchedFileHandler,它会在每次写入日志时检查文件是否存在。

六、结论

RotatingFileHandler 是 Python 标准库中一个功能强大的日志处理类,它能够帮助开发者有效地管理日志文件的大小和数量。通过合理配置其参数,开发者可以轻松地实现日志文件的滚动和备份功能,从而提高系统的可维护性和稳定性。

代码示例:

import logging  
from logging.handlers import RotatingFileHandler  
  
# 配置日志  
logger = logging.getLogger('Rotating Log')  
logger.setLevel(logging.DEBUG)  # 设置日志级别  
  
# 创建一个handler,用于写入日志文件,最多保存10MB,备份文件有5个  
handler = RotatingFileHandler('app.log', maxBytes=10*1024*1024, backupCount=5)  
handler.setLevel(logging.DEBUG)  
  
# 创建一个formatter,并将其添加到handler中  
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
handler.setFormatter(formatter)  
  
# 将handler添加到logger中  
logger.addHandler(handler)  
  
# 写入一些日志  
logger.debug('这是一个debug级别的日志')  
logger.info('这是一个info级别的日志')  
logger.warning('这是一个warning级别的日志')  
  
# 当'app.log'文件大小超过10MB时,它会自动备份,并创建一个新的'app.log'文件  
# 备份文件的命名方式通常是 app.log.1, app.log.2, ..., app.log.5

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Pythonlogging 模块提供了一种方便的方法来记录应用程序中的信息,包括错误、警告、调试信息等。如果你的应用程序在多个地方使用 logging 模块来记录信息,可能会导致日志文件中出现重复的信息。 为了防止这种情况,可以通过以下几种方式来避免重复生成日志: 1. 设置日志记录器的级别。使用不同的日志级别来记录不同类型的信息。在创建日志记录器时,可以设置其级别。如果某个日志记录器的级别设置为 DEBUG,那么所有 DEBUG 及以上级别的信息都会被记录下来。如果将日志级别设置为 WARNING,则只会记录 WARNING、ERROR 和 CRITICAL 级别的信息。这样,就可以避免重复记录同样级别的信息。 2. 避免重复设置日志处理器。在使用 logging 模块时,通常会创建多个日志处理器。如果多个处理器都记录相同的信息,就会导致日志文件中出现重复的信息。为了避免这种情况,可以在代码中检查是否已经创建了相同类型的处理器,如果已经创建,则不需要再创建。 3. 避免重复添加日志处理器。在某些情况下,可能需要将同一种类型的处理器添加到多个日志记录器中。如果多个日志记录器都添加了同样的处理器,就会导致重复记录信息。为了避免这种情况,可以在代码中检查是否已经将处理器添加到了相应的日志记录器中,如果已经添加,则不需要再添加。 综上所述,可以通过设置日志记录器的级别、避免重复设置日志处理器和避免重复添加日志处理器等方式来避免重复生成日志。 ### 回答2: Pythonlogging模块在使用过程中,可能会出现重复生成日志的情况。主要有以下几种可能原因: 1. 多次调用`logging.basicConfig()`方法:`basicConfig()`方法用于设置日志的基本配置,如果在代码中多次调用这个方法,会导致重复生成日志。解决方法是只在代码中调用一次`basicConfig()`,或者使用`logging.getLogger()`方法来获取logger对象,再进行设置。 2. 多次添加了相同的日志处理器:如果在代码中多次添加了相同的处理器(如FileHandler、StreamHandler等),会导致重复生成日志。解决方法是在添加处理器之前,先检查是否已经添加过相同类型的处理器,避免重复添加。 3. 日志级别设置不当:如果在代码中设置了多个处理器,并且给每个处理器设置了相同的日志级别,就会导致重复生成日志。这是因为每个处理器都会接收到同样级别的日志消息。解决方法是根据需求,为每个处理器设置不同的日志级别,避免重复记录。 4. 多线程环境下的竞争条件:在多线程环境下,如果多个线程同时调用日志记录方法,可能会导致消息重复记录。这是因为多个线程同时操作日志记录器。解决方法是使用线程安全的日志记录器,如`logging.getLogger()`返回的logger对象就是线程安全的。 综上所述,要避免Pythonlogging模块重复生成日志,需要注意在代码中的使用方式,避免多次调用`basicConfig()`方法、重复添加处理器和设置相同的日志级别,同时在多线程环境下使用线程安全的日志记录器。 ### 回答3: 在Python中, logging模块提供了记录日志的功能。当出现重复生成日志的情况时,一般是由于以下原因: 1. 多次调用了logging模块的配置函数:在程序中多次调用配置logging的函数,会导致重复生成log。为避免重复生成log,在程序的入口处或配置模块中应只调用一次配置函数。 2. 多次添加了相同的日志处理器:在配置logging模块时,如果多次添加了相同的日志处理器,比如多次调用`addHandler()`函数,则会导致相同的日志信息被多次记录,从而重复生成log。为避免此问题,应仅在配置函数中添加一次处理器。 3. 日志级别设置不合理:如果设置的日志级别过低,比如DEBUG级别,会将所有级别的日志都记录下来,从而导致重复生成log。应根据需求设置适当的日志级别,只记录需要的信息。 4. 并发多线程或多进程写日志:如果多个线程或进程同时写入同一个log文件,可能会导致日志信息重复。为避免此问题,可以在写入日志时使用线程锁或文件锁,以确保每次写入的日志不会重复。 总之,避免重复生成log的关键是正确地配置logging模块、合理设置日志级别,并注意线程或进程之间的并发写入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千天夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值