Я вижу дополнительные сообщения журнала после того, как импортировал модуль, который мне нужно использовать. Я пытаюсь найти правильный способ остановить это. Следующий код показывает лучшую проблему:
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__
есть только два обработчика, которые я добавил, откуда берутся эти сообщения?
Любые указатели относительно того, как я могу это решить, будут высоко оценены, поскольку я ударил стену.
Спасибо
Это ошибка в библиотеке 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