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