显然,我不应再使用ScrapyFileLogObserver(http://doc.scrapy.org/en/1.0/topics/logging.html)。但我仍然希望能够将我的日志消息保存到文件中,并且我仍然希望将所有标准Scrapy控制台信息保存到文件中。
从阅读有关如何使用日志记录模块的内容来看,这是我尝试使用的代码:
class BlahSpider(CrawlSpider):
name = 'blah'
allowed_domains = ['blah.com']
start_urls = ['https://www.blah.com/blahblahblah']
rules = (
Rule(SgmlLinkExtractor(allow=r'whatever'), callback='parse_item', follow=True),
)
def __init__(self):
CrawlSpider.__init__(self)
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
logging.basicConfig(filename='debug_log.txt', filemode='w', format='%(asctime)s %(levelname)s: %(message)s',
level=logging.DEBUG)
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
simple_format = logging.Formatter('%(levelname)s: %(message)s')
console.setFormatter(simple_format)
self.logger.addHandler(console)
self.logger.info("Something")
def parse_item(self):
i = BlahItem()
return i
它运行良好,它可以保存" Something"到文件。但是,我在命令提示符窗口中看到的所有内容,以及我在使用ScrapyFileLogObserver时保存到文件中的所有内容,现在都没有保存。
我认为我的"控制台"处理程序" logging.StreamHandler()"本来应该处理这个问题,但这正是我读过的内容,而且我真的不明白它是如何运作的。
任何人都可以指出我错过的或我出错的地方吗?
谢谢。
答案 0 :(得分:3)
我认为问题在于您已同时使用basicConfig
和addHandler
。
分别配置两个处理程序:
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
logFormatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
# file handler
fileHandler = logging.FileHandler("debug_log.txt")
fileHandler.setLevel(logging.DEBUG)
fileHandler.setFormatter(logFormatter)
self.logger.addHandler(fileHandler)
# console handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)
consoleHandler.setFormatter(logFormatter)
self.logger.addHandler(consoleHandler)
另见:
答案 1 :(得分:1)
您可以通过首先在scrapy.utils.log.configure_logging中禁用根句柄,然后添加自己的日志处理程序,来将所有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.DEBUG)
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.DEBUG)
rotating_file_log.setFormatter(formatter)
root_logger.addHandler(rotating_file_log)
我们还根据需要自定义日志级别(从DEBUG到INFO)和格式化程序。 希望这会有所帮助!