Scrapy日志记录:配置日志记录以重写日志文件

时间:2017-01-10 11:47:20

标签: python-2.7 scrapy

这是我的Scrapy代码......我是从Scrapy official documentation

复制的
import logging
from scrapy.utils.log import configure_logging

configure_logging(install_root_handler=False)
logging.basicConfig(
    filename='log.txt',
    format='%(levelname)s: %(message)s',
    level=logging.INFO,
    filemode = 'w'
)

现在的问题是,即使错误阈值为“INFO”,它仍会在日志中打印“DEBUG”消息。

有人为什么会这样吗?在我需要配置的其他地方还有其他设置吗?

此外,如果我在settings.py文件中设置以下标志,它可以正常工作(如预期的那样)......

LOG_FILE = 'mylog.txt'
LOG_LEVEL = 'INFO'

我没有在日志中看到任何'DEBUG'消息。但是每次运行爬虫时它只会附加到日志文件中。我需要清除文件并在每次抓取时再次写入。

由于

3 个答案:

答案 0 :(得分:1)

如果从命令行运行scrapy,则不需要此logging配置,因为默认情况下已调用它(更多信息here)。而是在settings.py文件中设置变量:

LOG_FORMAT = '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
LOG_LEVEL = 'INFO'
# DON'T SET LOG_FILE

现在,scrapy目前不支持直接记录文件模式(我sending a PR添加此功能),但您可以使用以下命令将终端输出重定向到文件(并始终覆盖它):

scrapy crawl myspider &> file.log

请注意,仅当您设置LOG_FILE时才会有效(因为它会创建FileHandler而不是StreamHandler)。

答案 1 :(得分:1)

您可以通过首先在scrapy.utils.log.configure_logging中禁用根句柄,然后添加自己的日志处理程序并根据需要自定义日志级别(从DEBUG到INFO)和格式化程序,来将所有scrapy日志记录到文件中。

在scrapy项目的settings.py文件中,添加以下代码:

import logging
from logging.handlers import RotatingFileHandler

from scrapy.utils.log import configure_logging

LOG_ENABLED = False
# Disable default Scrapy log settings.
configure_logging(install_root_handler=False)

# Define your logging settings.
log_file = '/tmp/logs/CRAWLER_logs.log'

root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rotating_file_log = RotatingFileHandler(log_file, maxBytes=10485760, backupCount=1)
rotating_file_log.setLevel(logging.INFO)
rotating_file_log.setFormatter(formatter)
root_logger.addHandler(rotating_file_log)

希望这会有所帮助!

答案 2 :(得分:0)

  

有人为什么会这样吗?

第一

logging.basicConfig(
   filename='log.txt',
   format='%(levelname)s: %(message)s',
   level=logging.INFO,
   filemode = 'w'  
)

当我们在settings.py中使用上面的日志记录功能配置日志时,实际上是为这个scrapy项目设置了根记录器。

第二

configure_logging(install_root_handler=False)

configure_logging做什么?是document says:

  

此功能可以:       -通过Python标准日志记录路由警告和扭曲日志记录       -分别为Scrapy和Twisted记录器分配DEBUG和ERROR级别       -如果LOG_STDOUT设置为True,则将stdout路由到日志

,并且scrapy的记录器消息已传播到其父记录器,并且您在settings.py中设置的父记录器将不检查级别,这是不直观的行为。

那是我们在记录器文件中获得调试和信息消息的原因

  

我还需要配置其他设置吗?

我个人认为,scrapy带来的很多信息是有帮助的,其中一些对于我的项目是多余的。

这是我的做法:

向处理程序添加过滤器:

def filter_out_item(record):
"""
filter out item log in scraper
"""
    if record.levelno < logging.WARNING \
        and record.module == 'scraper':
        return False
    return True

file_handler = logging.FileHandler('path_to_handler')
file_handler.addFilter(filter_out_item)
logging.basicConfig(
    handler=[file_handler,],
    format='%(levelname)s: %(message)s',
    level=logging.INFO
)

或者,如果要全局设置级别,只需设置处理程序级别

file_handler.setLevel(logging.INFO)

此设置将忽略所有低于INFO的消息级别,然后您将不会从scrapy模块中看到低于INFO的任何消息

希望此代码示例对您有所帮助