2021-09-18


废话不多说,直入主题。

这是logging官方文档地址

第一步:

from scrapy.utils.log import _get_handler
#按住ctrl键,鼠标点击一下就能找到该函数
如果不能进入,就按照下面的方法。
第一种情况:

如果你使用的是虚拟环境,那么就修改虚拟环境目录下的~/lib/site-packages/scrapy/utils/log.py这个文件。

第二种情况:

如果你不是使用虚拟环境,直接修改python安装目录下的~/lib/site-packages/scrapy/utils/log.py这个文件。
第二步
找到_get_handler(settings)这个函数。直接在文件里面搜索就行了。
我们阔以看到代码如下:


def _get_handler(settings):
    """ Return a log handler object according to settings """
    filename = settings.get('LOG_FILE')
    if filename:
        encoding = settings.get('LOG_ENCODING')
        handler = logging.FileHandler(filename, encoding=encoding)
    elif settings.getbool('LOG_ENABLED'):
        handler = logging.StreamHandler()
    else:
        handler = logging.NullHandler()

    formatter = logging.Formatter(
        fmt=settings.get('LOG_FORMAT'),
        datefmt=settings.get('LOG_DATEFORMAT')
    )
    handler.setFormatter(formatter)
    handler.setLevel(settings.get('LOG_LEVEL'))
    if settings.getbool('LOG_SHORT_NAMES'):
        handler.addFilter(TopLevelFormatter(['scrapy']))
    return handler

从上面的代码阔以看出scrapy自带log.py文件,只支持FileHandlerStreamHandler,目前logging支持对日志文件大小进行日志滚动,还支持自定义时间对日志进行滚动(比如只保留一分钟的日志,保留3个日志文件)。

我这里只说限制日志文件进行滚动,时间滚动的方法一致。
def _get_handler(settings):
    """Return a log handler object according to settings"""
    filename = settings.get("LOG_FILE")
    if filename:
        # 在settings里面设置每个日志文件大小
        filesize = settings.get("LOG_FILE_SIZE", 0)  
        # 在settings里面设置需要保留日志文件的个数
        filecounts = settings.get("LOG_FILE_COUNTS", 10)  
        encoding = settings.get("LOG_ENCODING", "utf-8")
        # 如果在settings里设置了日志文件大小,就创建大小滚动
        if filesize:  
            # 创建大小滚动的handler
            handler = logging.handlers.RotatingFileHandler(
                filename, 
                encoding=encoding, 
                maxBytes=filesize, 
                backupCount=filecounts
            )
        else:  # settings里面没设置,就默认scrapy框架自带的普通文件模式
            handler = logging.FileHandler(filename, encoding=encoding)
    elif settings.getbool("LOG_ENABLED"):
        handler = logging.StreamHandler()
    else:
        handler = logging.NullHandler()

    formatter = logging.Formatter(
        fmt=settings.get("LOG_FORMAT"), datefmt=settings.get("LOG_DATEFORMAT")
    )
    handler.setFormatter(formatter)
    handler.setLevel(settings.get("LOG_LEVEL"))
    if settings.getbool("LOG_SHORT_NAMES"):
        handler.addFilter(TopLevelFormatter(["scrapy"]))
    return handler


因为我们是直接修改框架的源码,而不是重写框架代码,为保证创建新项目时,忘记配置日志滚动相关参数,但是新项目无法运行,所以对配置参数进行判断,如果没有配置就使用框架默认的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值