Python日志模块中RotatingFileHandler中,如果maxBytes 或 backupCount 两者之一的值为零,就不会发生轮换


RotatingFileHandler 类位于 logging.handlers 模块,它支持磁盘日志文件的轮换。

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

返回一个 RotatingFileHandler 类的新实例。 将打开指定的文件并将其用作日志记录流。 如果未指定 mode,则会使用 ‘a’。 如果 encoding 不为 None,则会将其用作打开文件的编码格式。 如果 delay 为真值,则文件打开会被推迟至第一次调用 emit()。 默认情况下,文件会无限增长。 如果提供了 errors,它会被用于确定编码格式错误的处理方式。

执行 rollover 规则:

你可以使用 maxBytes 和 backupCount 值来允许文件以预定的大小执行 rollover。

当即将超出预定大小时,将关闭旧文件并打开一个新文件用于输出。 只要当前日志文件长度接近 maxBytes 就会发生轮换;

当 backupCount 为非零值时,系统将通过为原文件名添加扩展名 ‘.1’, ‘.2’ 等来保存旧日志文件。 例如,当 backupCount 为 5 而基本文件名为 app.log 时,你将得到 app.log, app.log.1, app.log.2 直至 app.log.5。 当前被写入的文件总是 app.log。 当此文件写满时,它会被关闭并重户名为 app.log.1,而如果文件 app.log.1, app.log.2 等存在,则它们会被分别重命名为 app.log.2, app.log.3 等等。子模块(函数)通过logger定义和主模块使用同一个日志模块

容易疏忽的点:

如果 maxBytes 或 backupCount 两者之一的值为零,就不会发生轮换,因此你通常要设置 backupCount 至少为 1,而 maxBytes 不能为零。

同时:如果maxBytes 不为0,backupCount为0时,maxBytes也无法生效,单个文件的大小

也会无限增长。

源码如下:


example:

# myFun.py

# encoding:utf8
import logging
from logging.handlers import RotatingFileHandler

#
# logging模块
# 设置单个日志文件最大3M (3145728字节,*8=位数),最多同时存在200个,总计600M,超过则循环式覆盖
# 当前正在写入的日志名称为Log,其它已达到最大容量的日志名称为 Log.1 .2 .3。。。
#


def myfun():
    # 共享主模块日志配置   [通过设置getLogger中的logger 名称与主模块共用同一个logger]
    logger = logging.getLogger('weilinlin')
    print('========fun========')
    for i in range(50):
        logger.debug("测试日志fun %d", i)
if __name__ == "__main__":
    print('main')
    myfun()
# encoding:utf8
import logging
from logging.handlers import RotatingFileHandler
import myFun

logger = logging.getLogger("weilinlin")  # 不加名称 设置为root logger
# 设置logger等级
logger.setLevel(logging.DEBUG)
# 设置日志格式
formatter = logging.Formatter(
    '%(asctime)s - %(pathname)s - %(name)s - %(levelname)s: - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S')

# 设置日志回滚  # 单个日志文件最大为1k,最多保存3份日志文件(除了当前写入的文件外),日志文件编码格式为utf-8
handler = RotatingFileHandler("Log", maxBytes=10240, backupCount=3, encoding='utf-8')
handler.setFormatter(formatter)

# 设置日志名称(此处的x是默认日志名称Log.1,Log.2等内容,会自动取到文件名,然后重命名为自定义的名称)
handler.namer = lambda x: "测试日志名称." + x.split('.')[-1]

# 给logger添加handler
logger.addHandler(handler)

# 测试主模块
for i in range(50):
    logger.debug("测试日志main %d", i)

# 测试子模块打印日志
myFun.myfun()



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Pytest,可以将测试用例共享的配置放在`conftest.py`文件。如果你想在`conftest.py`配置`RotatingFileHandler`对象,可以将其定义为一个fixture,然后在测试用例通过参数注入的方式使用它。 以下是一个示例代码,可以在`conftest.py`定义`RotatingFileHandler`对象,并将其作为fixture共享给其他测试模块: ```python import logging import pytest from logging.handlers import RotatingFileHandler # 定义日志文件名和路径 log_file = "test.log" log_path = "./logs" @pytest.fixture(scope="session") def logger(): # 创建RotatingFileHandler对象,设置日志文件大小为10MB,保留最近3个日志文件 handler = RotatingFileHandler(filename=log_file, mode='a', maxBytes=10*1024*1024, backupCount=3) # 设置日志级别为INFO handler.setLevel(logging.INFO) # 定义日志格式 formatter = logging.Formatter('[%(asctime)s] %(levelname)s: %(message)s') handler.setFormatter(formatter) # 添加handler到root logger logging.getLogger('').addHandler(handler) yield logging # 在fixture结束时,从root logger移除handler logging.getLogger('').removeHandler(handler) def test_example(logger): logger.info("Running test example...") # 测试代码 assert 1 == 1 ``` 在这个示例,我们将`RotatingFileHandler`对象定义为一个名为`logger`的fixture,它的作用域为`session`级别。在`fixture`,我们创建了一个`RotatingFileHandler`对象,并将其添加到root logger。然后,我们使用`yield`语句将`logging`模块作为fixture返回。在测试用例,我们通过参数注入的方式使用`logger`fixture,并在测试用例使用`logger`写入日志信息。 当所有的测试用例执行完毕后,`yield`语句后面的代码将被执行,我们在这里从root logger移除`handler`对象,以避免日志重复输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值