在我最近的项目中,有很多日志语句如下:
Bar bar = foo();
logger.info("something happened: param:{}", JSON.toJSONString(bar));
如您所见,只需json将对象序列化到日志中。有时bar非常大,序列化bar对象会占用太多时间,日志文件会扩展很多。json序列化框架是fasterxml
所以我的问题是:有没有一种方法,比如定制jsonserializer来实现:
计算已序列化的字符/字节数(通过调用方法#tojsonstring())
如果计数超过了最大值,比如说2000,那么停止
只返回2000字符的字符串并在日志文件中打印它
2条答案
按热度按时间5q4ezhmt1#
在做了一些研究之后,下面的想法出现了。这不是很优雅。希望有人能改进这个!
输出:
brqmpdu12#
如果我们不想陷入
Jackson
我们可以限制Writer
将对象序列化为。这是一种简单的方法,不需要在内部检查限制的情况下实现自定义序列化程序。这种方法的缺点是我们并没有跳过序列化过程,只是忽略了它的结果。你可以自己写
Writer
具有最大缓冲区大小。基于StringBuilder
:用法:
以上代码打印:
注意,有些方法
JSON
类返回Supplier<String>
. 如果您的记录器允许提供供应商,您应该使用它们。它允许将序列化推迟到真正需要的时候。如果你不能INFO
登录配置它将真正禁用此代码的执行。