Регистрация в Python: различное поведение между использованием fileconfig и программной конфигурацией - PullRequest
2 голосов
/ 19 октября 2011

Я только что обнаружил другое поведение ведения журнала Python, в зависимости от того, использую ли я ведение журнала с помощью fileconfig и ведение журнала с помощью программной конфигурации.

Для демонстрации я создал два минимальных примера.

В первом примере я настраиваю логирование программно.Этот пример работает должным образом - сообщение журнала отладки выводится на консоль.

# foo.py
import logging

logger = logging.getLogger(__name__)

class Foo(object):
    def __init__(self):
        logger.debug('debug log from Foo')

##########################################################################
# loggingtest.py
import logging.config

from foo import Foo

if __name__ == '__main__':
    consoleLogger = logging.StreamHandler()
    formatter = logging.Formatter(
        '%(asctime)-6s: %(name)s - %(levelname)s - %(message)s')
    consoleLogger = logging.StreamHandler()
    consoleLogger.setLevel(logging.DEBUG)
    consoleLogger.setFormatter(formatter)

    rootLogger = logging.getLogger() 
    rootLogger.addHandler(consoleLogger)
    rootLogger.setLevel(logging.NOTSET)
    # prints debug log message to console
    foo = Foo()

Во втором примере я настраиваю ведение журнала с помощью fileConfig.Насколько я вижу, log-config-file должен иметь точно такое же поведение.Но, тем не менее, сообщение журнала отладки НЕ печатается в этом примере.

# foo.py (same as above)
import logging

logger = logging.getLogger(__name__)

class Foo(object):
    def __init__(self):
        logger.debug('debug log from Foo')
##########################################################################
# loggingtest.py
import logging.config

from foo import Foo

if __name__ == '__main__':
    logging.config.fileConfig('logging.cfg')    

    # does NOT print debug log message to console. WHY???
    foo = Foo()

##########################################################################
# logging.cfg
[loggers]
keys = root

[logger_root]
level = NOTSET
handlers = consoleHandler

[formatters]
keys = complex

[formatter_complex]
format = %(asctime)s - %(name)s - %(levelname)s - %(module)s : %(lineno)d - %(message)s

[handlers]
keys = consoleHandler

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=complex
args=(sys.stdout,)

Так почему второй пример, использующий конфигурацию файла журнала, НЕ печатает мое сообщение журнала отладки на консоль?

1 Ответ

6 голосов
/ 19 октября 2011

Поскольку fileConfig отключает существующие регистраторы по умолчанию, позвоните

logging.config.fileConfig("logging.cfg")

до

from foo import Foo

или звоните

logging.config.fileConfig("logging.cfg",disable_existing_loggers=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...