废话不多说,直入主题。
第一步:
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文件,只支持FileHandler和StreamHandler,目前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
因为我们是直接修改框架的源码,而不是重写框架代码,为保证创建新项目时,忘记配置日志滚动相关参数,但是新项目无法运行,所以对配置参数进行判断,如果没有配置就使用框架默认的。