Scrapy日志处理器

3 投票
4 回答
6657 浏览
提问于 2025-04-17 07:21

我有两个问题想请教你们 - 我该如何设置不同的日志级别处理器,就像在Python中那样。目前,我有

STATS_ENABLED = True
STATS_DUMP = True 

LOG_FILE = 'crawl.log'

但是,Scrapy生成的调试信息也会被记录到日志文件里。这些信息很长,我希望DEBUG级别的消息只显示在标准错误输出中,而INFO级别的消息则记录到我的LOG_FILE里。

其次,在文档中提到日志服务必须通过scrapy.log.start()函数显式启动。我的问题是,我应该在哪里运行这个scrapy.log.start()呢?是在我的爬虫里面吗?

4 个回答

3

我希望DEBUG级别的信息保留在标准错误输出中,而INFO级别的信息则记录到我的LOG_FILE里。

你可以在settings.py文件中设置 LOG_LEVEL = 'INFO',但这样做会完全关闭DEBUG信息的输出。

4

其次,在文档中提到 日志服务必须通过 scrapy.log.start() 函数显式启动。我的问题是,我应该在哪里运行这个 scrapy.log.start()?是在我的爬虫里面吗?

如果你使用 scrapy crawl my_spider 来运行爬虫,日志会自动启动,只要 STATS_ENABLED = True

如果你手动启动爬虫进程,可以在启动爬虫进程之前运行 scrapy.log.start()

from scrapy.crawler import CrawlerProcess
from scrapy.conf import settings


settings.overrides.update({}) # your settings

crawlerProcess = CrawlerProcess(settings)
crawlerProcess.install()
crawlerProcess.configure()

crawlerProcess.crawl(spider) # your spider here

log.start() # depends on LOG_ENABLED

print "Starting crawler."
crawlerProcess.start()
print "Crawler stopped."

关于你第一个问题我知道的一点:

因为你需要手动启动 scrapy 日志,这样你就可以使用自己的日志记录器。

我觉得你可以复制 scrapy 源码中的 scrapy/scrapy/log.py 模块,修改它,然后导入这个修改后的模块,而不是使用 scrapy.log,然后运行 start() - 这样 scrapy 就会使用你的日志。在这个函数 start() 中,有一行代码是 log.startLoggingWithObserver(sflo.emit, setStdout=logstdout)

你可以创建自己的观察者(http://docs.python.org/howto/logging-cookbook.html#logging-to-multiple-destinations),并在这里使用它。

2

嗯,

我想更新一下,我已经能通过使用

from twisted.python import log
import logging
logging.basicConfig(level=logging.INFO, filemode='w', filename='log.txt'""")
observer = log.PythonLoggingObserver()
observer.start()

来让日志文件处理器正常工作了。不过,我还不能让日志在标准错误中显示爬虫的名字,就像在twisted中那样。我在这里发了个问题

撰写回答