python 在RotatingFileHandler上设置maxBytes会导致每条记录调用Formatter.format()两次

oewdyzsn  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(102)

有人能解释一下为什么在RotatingFileHandler上设置maxBytes会导致每个日志记录调用DerivedFormatter.format()两次吗?最后,只有一个条目进入日志文件,但是我希望在DerivedFormatter.format()中执行一些不应该多次执行的逻辑。
示例:

# Python 3.10.6
import logging
from logging.handlers import RotatingFileHandler

class DerivedFormatter(logging.Formatter):
    def __init__(self, fmt=None, datefmt=None, style='%'):
        super().__init__(fmt, datefmt, style)

    def format(self, record):
        print("format_override called.")
        return super().format(record)

format = '%(asctime)s | %(levelname)-8s | %(filename)s | %(message)s'
log_file = "fubar.log"

Log = logging.getLogger()
Log.handlers.clear()
Log.setLevel(logging.DEBUG)

fhandler = RotatingFileHandler(log_file)
fhandler.maxBytes = 102400 # comment this line
fhandler.backupCount = 1
fhandler.setFormatter(DerivedFormatter(format))
Log.addHandler(fhandler)

Log.info("something happened")

当注解掉设置fhandler.maxBytes的行时,DerivedFormatter.format()只被调用一次。
先谢谢你了。

u5rb5r59

u5rb5r591#

感谢Michael Ruth的评论,并让我的调试器给予我更多的信息,了解正在发生的事情。RotatingFileHandler.shouldRollover()检查是否为maxBytes > 0,然后调用format()以获取格式化的消息并检查长度。
谢谢迈克尔的帮助!

相关问题