Импортированный модуль добавления нежелательных журналов. Как это можно подавить?

1

Я вижу дополнительные сообщения журнала после того, как импортировал модуль, который мне нужно использовать. Я пытаюсь найти правильный способ остановить это. Следующий код показывает лучшую проблему:

import os
import logging
import flickrapi

class someObject:
    def __init__(self):
        self.value = 1
        logger = logging.getLogger(__name__)
        print logger.handlers
        logger.info("value = " + str(self.value))

def main():
    # Set up logging
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('[%(asctime)-15s] %(name)-8s %(levelname)-6s %message)s')
    fh = logging.FileHandler(os.path.splitext(os.path.basename(__file__))[0]+".log")
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    ch.setFormatter(formatter)
    logger.addHandler(ch)
    logger.debug("Debug message")
    logger.info("Info message")

    thingy = someObject()

if __name__ == "__main__":
    main()

При импорте flickrapi я вижу следующий вывод:

DEBUG:__main__:Debug message
[2013-05-03 12:10:47,755] __main__ INFO   Info message
INFO:__main__:Info message
[<logging.FileHandler instance at 0x1676dd0>, <logging.StreamHandler instance at 0x1676ea8>]
[2013-05-03 12:10:47,755] __main__ INFO   value = 1
INFO:__main__:value = 1

С удалением flickrapi я вижу правильный вывод:

[2013-05-03 12:10:47,755] __main__ INFO   Info message
[<logging.FileHandler instance at 0x1676dd0>, <logging.StreamHandler instance at 0x1676ea8>]
[2013-05-03 12:10:47,755] __main__ INFO   value = 1

Это мой первый раз, когда я использовал журнал, и это немного озадачило меня. Я читал документацию пару раз, но я думаю, что мне что-то не хватает в моем понимании.

Глядя на logging.Logger.manager.loggerDict, есть и другие регистраторы, но каждый из них .handlers пуст. У регистратора __main__ есть только два обработчика, которые я добавил, откуда берутся эти сообщения?

Любые указатели относительно того, как я могу это решить, будут высоко оценены, поскольку я ударил стену.

Спасибо

Теги:
logging

1 ответ

3
Лучший ответ

Это ошибка в библиотеке flickrapi, которую вы используете. Он вызывает logging.basicConfig() в it __init__.py, что является неправильной вещью для библиотеки, поскольку она добавляет StreamHandler по умолчанию к stderr в корневой журнал.

Вероятно, вам следует открыть отчет об ошибке с автором. В документах протоколирования python существует HOWTO о том, как библиотеки должны настраивать ведение журнала.

Чтобы обойти эту проблему до тех пор, пока ошибка не будет исправлена, вы должны будете сделать следующее:

# at the top of your module before doing anything else
import flickrapi
import logging
try:
    logging.root.handlers.pop()
except IndexError:
    # once the bug is fixed in the library the handlers list will be empty - so we need to catch this error
    pass
  • 0
    Большое спасибо. Я отправлю сообщение об ошибке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню