Python: Как создать и использовать настраиваемый регистратор в модуле ведения журнала Python? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать собственный регистратор, как показано в коде ниже.Однако независимо от того, какой уровень я передаю функции, регистратор печатает только предупреждающие сообщения.Например, даже если я установил аргумент level = logging.DEBUG по умолчанию, мой код не может записать сообщения отладки или информационные сообщения.Может кто-то указать на проблему здесь.

import boto3
import logging


def get_logger(name=__name__, level=logging.DEBUG):
    # Create log handler
    logHandler = logging.StreamHandler()
    logHandler.setLevel(level)

    # Set handler format
    logFormat = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%d-%b-%y")
    logHandler.setFormatter(logFormat)

    # Create logger
    logger = logging.getLogger(name)
    # Add handler to logger
    logger.addHandler(logHandler)

    # Stop propagating the log messages to root logger
    # logger.propagate = False

    return logger


def listBuckets():

    logThis = get_logger(level=logging.DEBUG)

    s3 = boto3.resource('s3')
    for bucket in s3.buckets.all():
        logThis.debug(msg='This message is from logger')
        print(bucket.name)


listBuckets()

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вам не хватает того факта, что а) конечным предком каждого регистратора является регистратор root (по умолчанию имеет уровень WARNING) и b) что уровни как у регистраторов, так и у обработчиков есть.

Состояние документов :

Когда создается регистратор, для уровня устанавливается значение NOTSET (, в результате чего все сообщения будутобрабатывается, когда регистратор является корневым регистратором, или делегирование родительскому элементу, когда регистратор является некорневым регистратором ).

Итак, вы создаете регистратор и StreamHandler сих уровень по умолчанию NOTSET.Ваш регистратор является неявным потомком регистратора root .Вы устанавливаете обработчик на уровень DEBUG, но не logger , использующий этот обработчик.Поскольку уровень в вашем логгере все еще равен NOTSET, когда происходит событие журнала, его цепочка предков пересекается ...

... до тех пор, пока один из предков с уровнем, отличным от NOTSET, не станетнайден или получен рут.

[...]

Если корень достигнут и имеет уровень NOTSET, то все сообщения будутобработанный.В противном случае уровень корня будет использоваться в качестве эффективного уровня .

Это означает, что вы сразу же окажетесь в логгере root , чтобы определить эффективный журналуровень;он установлен на WARNING в соответствии с настройками root logger по умолчанию.Вы можете проверить это с помощью свойств parent и level и метода getEffectiveLevel объекта logger:

logThis = get_logger()
print(logThis.parent)               # <RootLogger root (WARNING)>
print(logThis.level)                # 0 (= NOTSET)
print(logThis.getEffectiveLevel())  # 30 (= WARNING) from root logger

Чтобы ваш регистратор мог обрабатывать сообщения на самом желаемом уровне и выше него.просто установите его на регистраторе с помощью logger.setLevel(level) в функции get_logger.

0 голосов
/ 26 ноября 2018

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

  • Уровень журнала родителя / предка имеет приоритет при оценке эффективного уровня журнала
  • Корневой регистратор, например, созданный с помощью getLogger , имеет ПРЕДУПРЕЖДЕНИЕ в качестве уровня журнала по умолчанию

Вы установили уровень журнала обработчика( logHandler ), но не root ( logger ).На этом этапе ни один обработчик не может иметь уровень журналирования, меньший, чем уровень root, то есть WARNING

logHandler.setLevel(level)
logger.addHandler(logHandler)
logThis.debug(msg='This message is from logger')  # Does not log
logThis.warn(msg='This message is from logger')  # Logs

Итак, установите уровень root на что-то разумное, и вы должны хорошо идти

logHandler.setLevel('WARNING')  # or NOTSET
logThis.debug(msg='This message is from logger') # Logs!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...