Scrapy - регистрация в файл и stdout одновременно, с именами паук
Я решил использовать модуль протоколирования Python, потому что сообщения, созданные с помощью Twisted on std error, слишком длинны, и я хочу INFO
выделять значимые сообщения, такие как те, которые сгенерированы StatsCollector
для записи на отдельный файл журнала при сохранении сообщений на экране.
from twisted.python import log
import logging
logging.basicConfig(level=logging.INFO, filemode='w', filename='buyerlog.txt')
observer = log.PythonLoggingObserver()
observer.start()
Ну, это прекрасно, у меня есть мои сообщения, но недостатком является то, что я не знаю, что сообщения генерируются с помощью этого паук! Это мой файл журнала, при этом "twisted" отображается %(name)s
:
INFO:twisted:Log opened.
2 INFO:twisted:Scrapy 0.12.0.2543 started (bot: property)
3 INFO:twisted:scrapy.telnet.TelnetConsole starting on 6023
4 INFO:twisted:scrapy.webservice.WebService starting on 6080
5 INFO:twisted:Spider opened
6 INFO:twisted:Spider opened
7 INFO:twisted:Received SIGINT, shutting down gracefully. Send again to force unclean shutdown
8 INFO:twisted:Closing spider (shutdown)
9 INFO:twisted:Closing spider (shutdown)
10 INFO:twisted:Dumping spider stats:
11 {'downloader/exception_count': 3,
12 'downloader/exception_type_count/scrapy.exceptions.IgnoreRequest': 3,
13 'downloader/request_bytes': 9973,
По сравнению с сообщениями, генерируемыми из скрученной по стандартной ошибке:
2011-12-16 17:34:56+0800 [expats] DEBUG: number of rules: 4
2011-12-16 17:34:56+0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2011-12-16 17:34:56+0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2011-12-16 17:34:56+0800 [iproperty] INFO: Spider opened
2011-12-16 17:34:56+0800 [iproperty] DEBUG: Redirecting (301) to <GET http://www.iproperty.com.sg/> from <GET http://iproperty.com.sg>
2011-12-16 17:34:57+0800 [iproperty] DEBUG: Crawled (200) <
Я пробовал% (name) s,% (module) s среди других, но, похоже, я не могу показать имя паука. Кто-нибудь знает ответ?
EDIT:
проблема с использованием LOG_FILE
и LOG_LEVEL
в настройках заключается в том, что сообщения нижнего уровня не будут отображаться при ошибке std.
Ответы
Ответ 1
Вы хотите использовать ScrapyFileLogObserver
.
import logging
from scrapy.log import ScrapyFileLogObserver
logfile = open('testlog.log', 'w')
log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG)
log_observer.start()
Я рад, что вы задали этот вопрос, я тоже хотел сделать это.
Ответ 2
Очень легко перенаправить вывод, используя: scrapy some-scrapy's-args 2>&1 | tee -a logname
Таким образом, все, что делает scrapy в stdout и stderr, будет перенаправлено на файл logname, а также придет на экран.
Ответ 3
Для всех тех людей, которые пришли сюда, прежде чем читать текущую версию :
import logging
from scrapy.utils.log import configure_logging
configure_logging(install_root_handler=False)
logging.basicConfig(
filename='log.txt',
filemode = 'a',
format='%(levelname)s: %(message)s',
level=logging.DEBUG
)
Ответ 4
Я знаю, что это старо, но это был действительно полезный пост, поскольку класс все еще не документирован в документах Scrapy. Кроме того, мы можем пропустить импорт журналов и использование журналов scrapy напрямую. Спасибо всем!
from scrapy import log
logfile = open('testlog.log', 'a')
log_observer = log.ScrapyFileLogObserver(logfile, level=log.DEBUG)
log_observer.start()