我正在尝试使用python日志模块创建一个自定义日志文件,该文件记录其他信息(如主机名)并将其添加到数据库中。下面是我为此创建的类,处理程序部分工作得很好,但是现在我添加了一个自定义的LogRecord
类,它抛出了这个错误:
/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
错误在于告诉您到底出了什么问题;您调用的构造函数的参数太多。要了解我的意思,请看一下在
makeRecord
的默认实现中,日志记录通常是如何构造的:注意makeRecord如何获取一个不直接传递给
LogRecord
的extra
参数?另一方面,您直接将其传递给LogRecord.__init__
,这是导致错误的原因。从这里开始,您有两个选项;您可以提供一个更完整的
makeRecord
实现,或者您可以尝试使用LoggerAdapter
类,该类可以帮助您用更少的代码实现相同的目标。下面是一个例子:
如果每次记录某个内容时都需要计算“host”(例如)的值,那么可以将
context
作为类的实例,使其看起来像字典。就像这样:关于
LoggingAdapter
需要注意的一点是,它显然没有将所有方便的快捷方式函数定义为普通的Logger类。这就是为什么我调用了warning
方法,而不是像上面那样调用warn
。有关
LoggingAdapter
和向日志添加上下文的更多信息,请参见python docs。注意-我的示例中没有包含
MyLogHandler
、MyLogFormatter
或MongoLogger
,因为它们与问题/错误无关。相关问题 更多 >
编程相关推荐