在Python中序列化日志记录

2024-10-01 15:29:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

一切都很好,除了我没有找到简单的方法来检查日志是否是我想要的。在

到目前为止,我得到了一个例外:

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

代码如下:

^{pr2}$

收费记录器:

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())

收费记录器:

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()

Tags: 方法selfjsonobjinitloggingdeflogger
1条回答
网友
1楼 · 发布于 2024-10-01 15:29:21

必须实现自定义序列化。 它可以简单到如下:

from json import JSONEncoder

class LogEncoder(JSONEncoder):
    def default(self, obj):
        try:
            return obj.__dict__ ['records']
        except:
            return obj.__dict__

然后,您可以序列化日志记录:

^{pr2}$

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

相关问题 更多 >

    热门问题