Я пытаюсь использовать модуль регистрации python для создания пользовательского файла журнала, который записывает другую информацию, такую как имя хоста, и добавляет ее в мою БД. Ниже приведены классы я создал, чтобы сделать это, и Handler часть работала просто отлично, но теперь, когда я добавил пользовательский класс LogRecord
, он выдает эту ошибку:python logging: Custom Python LogRecord Throwing error
/src/lib/__init__.py", line 31, in __init__
logging.LogRecord.__init__(self, *args, **kwargs)
exceptions.TypeError: __init__() takes at most 9 arguments (10 given)
А вот как я исполняю его
logging.setLoggerClass(MyLogger)
log = logging.getLogger('testing')
log.addHandler(MyLogHandler())
d = {'host': '192.168.0.1'}
log.warn('Hi', d)
И вот классы. Это, очевидно, связано с * args, ** kwargs, но когда я смотрю на это, args пуст, а ** kwargs содержит только переменную d
, указанную выше. Я не понимаю эту проблему.
class MyLogRecord(logging.LogRecord):
def __init__(self, *args, **kwargs):
logging.LogRecord.__init__(self, *args, **kwargs) //THIS IS THE LINE IT DIES ON
self.host = 'localhost'
class MyLogFormatter(logging.Formatter):
def __init__(self, fmt, datefmt=None, host=None):
logging.Formatter.__init__(self, fmt, datefmt)
self.host = host
def format(self, record):
return logging.Formatter.format(record)
class MyLogger(logging.getLoggerClass()):
def makeRecord(self, *args, **kwargs):
return MyLogRecord(*args, **kwargs)
class MyLogHandler(logging.Handler): # Inherit from logging.Handler
def __init__(self):
# run the regular Handler __init__
logging.Handler.__init__(self)
# Our custom argument
self.mongo = MongoLogger()
def setupCustomLogger(self, name, this_host):
formatter = MyLogFormatter(fmt='%(asctime)s - %(levelname)s - %(module)s - %(message)s - %(host)s')
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
return logger
def emit(self, record):
# record.message is the log message
self.mongo.log(record)
class MongoLogger(object):
'''Logs messages to a MongoDB fh_admin log collection.'''
def log(self, message):
#@todo write log to DB
print message
Вы не предоставили достаточно кода для воспроизведения проблемы. Даже после удаления ссылок на классы, которые вы не включили (FirehoseLogRecord, MongoLogger), я не могу воспроизвести эту ошибку, которую вы описываете. –
Извините, что обновил вопрос. Это не должно быть FirehoseLogRecord, это должен был быть MyLogRecord, что и вызывает проблему. – Nathan
Смотрите, он умирает от суперкласса init. Является ли простой 'logging.LogRecord .__ init__' умирать в _same аргументе list_? – 9000