Поиск по блогу

суббота, 29 ноября 2014 г.

Примеры настройки логирования в Scrapy и картинка "loggers, handlers, filters, and formatters"

"If you’re ready for that, grab some of your favourite beverage and carry on"... Так я начал читать документацию "дебаггинг для продвинутых", поскольку предстоит писать в длиннющие логи... Сначала я нашел на Stackoverflow варианты вывода логов в фва файла, а потом прочитал еще и мануалы Python...

Смутные мысли (до разбора примеров) о том, как бы надо организовать логирование для Scrapy. Вывод в разные файлы (два, как минимум), при использовании исключений - показ ошибок, которые до этого показывались в консоли...

После того, как я подправил этот пример (в оригинале ... level=logging.INFO ...), то в папке C:\Users\kiss\SkyDrive\Docs\mailru\mail_csv_1\CSVmailSpider появились два файла (spider.log и spider_error.log), так что код ниже можно тупо использовать

In []:
# Вот этот код я добавил в  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)
In []:
# 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()

Почему я скопипастил этот заурядный пример (см. ниже)? Чтобы отметить очередное "великое открытие" ... именно в этом коде написано то, что я знал, но не применял до сих пор при отладке:

In []:
#задать тесты в def main()
if __name__ == '__main__':
    main()

Я же про это читал, но не запомнил? Нет, "запомнил", но к этому участку мозга надо было прорастить ассоциативные синапсы... Собственно, именно этим "проращиванием я" в ближайшее время и должен заняться !!! Получается, что просто прочитать (я сотни раз видел if name == 'main': и перестал себе задавать вопрос, а зачем здесь эта хрень...) Пока что я писал коротенькие модули и заполнял чужие шаблонные... проб кусочков кода в консоли хватало..., но вот читаю логирование и самое время всерьез задуматся о тестировании в процессе разработки...

In []:
# 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()
In []:
 mylib.py
import logging

def do_something():
    logging.info('Doing something')

If you run myapp.py, you should see this in myapp.log:

In []:
INFO:root:Started
INFO:root:Doing something
INFO:root:Finished

Здесь мы импоритруем logging в оба модуля, а путь к лог-файлу задаем только в первом..., все пишется в один файл, и надо помечать, что и откуда, иначе не разберешься...

In []:
Обратил внимание на синтаксис - все в скобках, строки через запятую... не нравится мен все это !
In []:
import logging
logging.warning('%s before you %s', 'Look', 'leap!')
In []:
#will display:
WARNING:root:Look before you leap!
In []:
Что мне здесь не нравится ? Просматривается некая синтаксическая путаница, вот так можно просто напечатать эту строчку: 
In [3]:
'%s before you %s'%('Look','leap!')
Out[3]:
'Look before you leap!'

Основная строка в кавычках, внутри фрагменты вида %s (%d ....) а потом знак %, а после него в скобках строки (числа), которые вставляются по порядку

The logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.

In [8]:
from IPython.display import Image
In [9]:
Image('https://docs.python.org/2.7/_images/logging_flow.png')
Out[9]:

Здесь ограничимся этой диаграммой и перейдем к примерам

Начал было разбирать примеры, но пришел к выводу, что мне не скоро понадобятся эти опции. Потому решил попробовать код примеров со Stackoverflow. Первый же пример подошел (см. начало поста).



Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий