在Python中序列化日志记录
我想测试一个方法的日志输出 一切都很好,除了我发现没有简单的方法来检查日志记录是否是我想要的方式 到目前为止,我得到了一个例外:在Python中序列化日志记录,python,logging,serialization,Python,Logging,Serialization,我想测试一个方法的日志输出 一切都很好,除了我发现没有简单的方法来检查日志记录是否是我想要的方式 到目前为止,我得到了一个例外: TypeError: <logging.LogRecord object> is not JSON serializable ToListLogger: class ToListLogger(logging.Logger): def __init__(self): super(ToListLogger, self).__init_
TypeError: <logging.LogRecord object> is not JSON serializable
ToListLogger:
class ToListLogger(logging.Logger):
def __init__(self):
super(ToListLogger, self).__init__('ToListLogger')
self.records=[]
def handle(self, record):
self.records.append(record)
class ToListLogger(logging.Logger):
def __init__(self):
super(ToListLogger, self).__init__('ToListLogger')
self.records=[]
def handle(self, record):
self.records.append(record)
def to_json(self):
return LogRecordEncoder().encode(self.records)
class LogRecordEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, logging.LogRecord):
return dict(msg=obj.msg)
raise NotImplementedError()
我寻找一种将日志记录实例序列化为人类可读格式的方法。JSON是我的最爱,但另一个也可以接受
我的意图是:测试应该简短、美观、可读
解决方案
我的解决方案基于maccinza的答案:
测试用例:
class TestCase(unittest.TestCase):
def test_foo(self):
logger=ToListLogger()
foo=Foo.do_something(logger)
self.assertEqual('[...]', logger.to_json())
ToListLogger:
class ToListLogger(logging.Logger):
def __init__(self):
super(ToListLogger, self).__init__('ToListLogger')
self.records=[]
def handle(self, record):
self.records.append(record)
class ToListLogger(logging.Logger):
def __init__(self):
super(ToListLogger, self).__init__('ToListLogger')
self.records=[]
def handle(self, record):
self.records.append(record)
def to_json(self):
return LogRecordEncoder().encode(self.records)
class LogRecordEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, logging.LogRecord):
return dict(msg=obj.msg)
raise NotImplementedError()
您必须实现自定义序列化。 它可以简单如下:
from json import JSONEncoder
class LogEncoder(JSONEncoder):
def default(self, obj):
try:
return obj.__dict__ ['records']
except:
return obj.__dict__
然后,您可以序列化日志记录:
# get your log instance
my_log_instance = ToListLogger()
# populate its records list
# ...
# then serialize it
serialized = LogEncoder().encode(my_log_instance)
它将向您转储记录列表的字符串表示形式。更简单的是,您的默认方法可以返回obj.records。我在答案中添加了我的解决方案。它基于您的解决方案。非常感谢。