Смутные мысли (до разбора примеров) о том, как бы надо организовать логирование для Scrapy. Вывод в разные файлы (два, как минимум), при использовании исключений - показ ошибок, которые до этого показывались в консоли...
Logging
11.5. Logging
15.7. logging — Logging facility for Python
15.8. logging.config — Logging configuration
15.9. logging.handlers — Logging handlers
26. Debugging and Profiling
Logging HOWTO
Logging Cookbook
Logging to specific error log file in scrapy
Scrapy - logging to file and stdout simultaneously, with spider names
После того, как я подправил этот пример (в оригинале ... level=logging.INFO ...), то в папке C:\Users\kiss\SkyDrive\Docs\mailru\mail_csv_1\CSVmailSpider появились два файла (spider.log и spider_error.log), так что код ниже можно тупо использовать
# Вот этот код я добавил в C:\Users\kiss\SkyDrive\Docs\mailru\mail_csv_1\CSVmailSpider
#
#Another option is to start two file log observers in __init__.py:
from scrapy.log import ScrapyFileLogObserver
from scrapy import log
class MySpider(BaseSpider):
name = "myspider"
def __init__(self, name=None, **kwargs):
ScrapyFileLogObserver(open("spider.log", 'w'), level=log.logging.INFO).start()
ScrapyFileLogObserver(open("spider_error.log", 'w'), level=log.logging.ERROR).start()
super(MySpider, self).__init__(name, **kwargs)
# know this is old but it was a really helpful post since the class still
#isn't properly documented in the Scrapy docs.
#Also, we can skip importing logging and use scrapy logs directly. Thanks All!
from scrapy import log
logfile = open('testlog.log', 'a')
log_observer = log.ScrapyFileLogObserver(logfile, level=log.DEBUG)
log_observer.start()
Почему я скопипастил этот заурядный пример (см. ниже)? Чтобы отметить очередное "великое открытие" ... именно в этом коде написано то, что я знал, но не применял до сих пор при отладке:
#задать тесты в def main()
if __name__ == '__main__':
main()
Я же про это читал, но не запомнил? Нет, "запомнил", но к этому участку мозга надо было прорастить ассоциативные синапсы... Собственно, именно этим "проращиванием я" в ближайшее время и должен заняться !!! Получается, что просто прочитать (я сотни раз видел if name == 'main': и перестал себе задавать вопрос, а зачем здесь эта хрень...) Пока что я писал коротенькие модули и заполнял чужие шаблонные... проб кусочков кода в консоли хватало..., но вот читаю логирование и самое время всерьез задуматся о тестировании в процессе разработки...
# myapp.py
import logging
import mylib
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logging.info('Started')
mylib.do_something()
logging.info('Finished')
if __name__ == '__main__':
main()
mylib.py
import logging
def do_something():
logging.info('Doing something')
If you run myapp.py, you should see this in myapp.log:
INFO:root:Started
INFO:root:Doing something
INFO:root:Finished
Здесь мы импоритруем logging в оба модуля, а путь к лог-файлу задаем только в первом..., все пишется в один файл, и надо помечать, что и откуда, иначе не разберешься...
Обратил внимание на синтаксис - все в скобках, строки через запятую... не нравится мен все это !
import logging
logging.warning('%s before you %s', 'Look', 'leap!')
#will display:
WARNING:root:Look before you leap!
Что мне здесь не нравится ? Просматривается некая синтаксическая путаница, вот так можно просто напечатать эту строчку:
'%s before you %s'%('Look','leap!')
Основная строка в кавычках, внутри фрагменты вида %s (%d ....) а потом знак %, а после него в скобках строки (числа), которые вставляются по порядку¶
The logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.
from IPython.display import Image
Image('https://docs.python.org/2.7/_images/logging_flow.png')
Здесь ограничимся этой диаграммой и перейдем к примерам
Начал было разбирать примеры, но пришел к выводу, что мне не скоро понадобятся эти опции. Потому решил попробовать код примеров со Stackoverflow. Первый же пример подошел (см. начало поста).
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий