Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中序列化日志记录_Python_Logging_Serialization - Fatal编程技术网

在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。我在答案中添加了我的解决方案。它基于您的解决方案。非常感谢。