在 Python 中序列化 LogRecords

Serialize LogRecords in Python

我想测试一个方法的日志输出。

一切正常,除了我发现没有简单的方法来检查完成的日志记录是否符合我的要求。

到目前为止我得到这个异常:

TypeError: <logging.LogRecord object> is not JSON serializable

代码如下:

class TestCase(unittest.TestCase):
   def test_foo(self):
        logger=ToListLogger()
        foo=Foo.do_something(logger)
        self.assertEqual('[...]', json.dumps(logger.records))

ToListLogger:

class ToListLogger(logging.Logger):
    def __init__(self):
        super(ToListLogger, self).__init__('ToListLogger')
        self.records=[]

    def handle(self, record):
        self.records.append(record)

我正在寻找一种将 LogRecord 实例序列化为人类可读格式的方法。 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)

    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)

它将转储您的记录列表的字符串表示形式。