Проблема входа в Python 3.7 при включении logging.propagate - PullRequest
0 голосов
/ 28 декабря 2018

Я создал свой регистратор и попытался добавить обработчики.

import logging
from os.path import abspath, basename, dirname, join, splitext


def BuildLogger(sourcePath):  #, logPath=None):
    srcBasename = basename(sourcePath)
    logging.basicConfig(level=logging.DEBUG)  # Must have to see DEBUG/INFO at all
    logger = logging.getLogger(srcBasename)
    logger.propagate = False  # Must remove under py3.7, but keep for earlier versions to see logger message.

    # Avoid duplicated logs caused by duplicated handlers each time we create logger from a different module.
    if logger.hasHandlers():
        return logger

    # Console log is for end-users: no debug messages.
    consoleHanlder = logging.StreamHandler()
    consoleHanlder.setLevel(logging.INFO)
    consoleHanlder.setFormatter(logging.Formatter('%(levelname)s: %(_name)s: %(message)s'))
    logger.addHandler(consoleHanlder)

    return logger

if __name__ == '__main__':
    mylogger = BuildLogger(__file__)
    mylogger.info('hello')

Однако этот код вызывает KeyError при входе в систему с помощью моего регистратора.

--- Logging error ---
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
KeyError: '_name'
Call stack:
  File "/Users/kakyo/Desktop/0.Dev/playground/python/tkinter/logging_bug.py", line 25, in <module>
    mylogger.info('hello')
Message: 'hello'
Arguments: ()

Я проследил это до BuildLogger(), где я сделал следующее:

logger = logging.getLogger(srcBasename)
logger.propagate = False 

Как только я закомментировал строку logger.propagate, проблема исчезла.

Эта проблема, похоже, возникает только в Python 3.7.У меня не было этого в Python 3.6.Фактически, мне нужна была эта строка, чтобы что-то показать в моем файле регистратора.

Это ошибка или функция?

1 Ответ

0 голосов
/ 30 декабря 2018

Вы обращаетесь к неопределенному атрибуту в вашем форматере, _name не существует, вы должны использовать name:

logging.Formatter('%(levelname)s: %(name)s: %(message)s')

Если вы внимательно посмотрите на сообщение об ошибке, оно говорит вам:


--- Logging error ---
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 1034, in emit
    msg = self.format(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 880, in format
    return fmt.format(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 622, in format
    s = self.formatMessage(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 591, in formatMessage
    return self._style.format(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 433, in format
    return self._fmt % record.__dict__
<b>KeyError: '_name'</b>
Call stack:
  File "/Users/kakyo/Desktop/0.Dev/playground/python/tkinter/logging_bug.py", line 25, in 
    mylogger.info('hello')
Message: 'hello'
Arguments: ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...