Python Logger записывает вещи дважды в консоль

Я пытаюсь собрать регистратор, используя Python. Я работаю в версии 2.6, поэтому я не могу использовать новый метод стиля словаря и вместо этого собираюсь с хорошим старомодным конфигурационным файлом. Проблема в том, что материал выводит дважды в консоль, и я не могу понять, почему. Здесь мой тест script:

import logging
import logging.config

if __name__ == "__main__":
    logging.config.fileConfig("newSlogger.conf")
    slogger = logging.getLogger("sloggerMain")

    slogger.debug("dbg msg")
    slogger.info("herp derp dominae")

Вот мой конфигурационный файл:

[loggers]
keys=root,sloggerMain,sloggerSecondary

[handlers]
keys=consoleHandler,infoFileHandler,debugFileHandler

[formatters]
keys=consoleFormatter,infoFileFormatter,debugFileFormatter

[logger_root]
handlers=consoleHandler
level=NOTSET

[logger_sloggerMain]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerMain

[logger_sloggerSecondary]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerSecondary

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
format=consoleFormatter
args=(sys.stdout,)

[handler_infoFileHandler]
class=FileHandler
level=INFO
formatter=infoFileFormatter
args=("testlog.log", "w")

[handler_debugFileHandler]
class=FileHandler
level=DEBUG
formatter=debugFileFormatter
args=("testlogdbg.log", "w")

[formatter_consoleFormatter]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

[formatter_infoFileFormatter]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

[formatter_debugFileFormatter]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

[formatter_syslogFormatter]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

Любые идеи?

Ответы

Ответ 1

Измените регистраторы без полномочий root, чтобы установить propagate в 0, чтобы предотвратить распространение сообщений до корневого регистратора:

[logger_sloggerMain]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerMain
propagate=0

Модуль logging docs говорит:

Рекордеры для детей распространяют сообщения до обработчики, связанные с их предковые регистраторы. Из-за этого нет необходимости определять и настраивать обработчиков для всех регистраторов приложение использует. Достаточно настроить обработчики для верхнего уровня logger и создать дочерние регистраторы как необходимо.

Регистратор sloggerMain является дочерним элементом регистратора root. По умолчанию сообщения, отправленные в этот регистратор, также распространяются вверх.

Вы также можете просто отключить корневой журнал, чтобы устранить проблему:

[logger_root]
handlers=