我在记忆中有一些大的杰克逊JsonNode
物品。出于调试/跟踪目的,我使用SLF4J-Logback以适当的日志级别记录它们。
由于输出字符串的大小,这会导致OutOfMemory异常和崩溃。请注意,这些JsonNode
对象已经在内存中,因此它不是解析问题。
杰克逊有没有办法将漂亮打印的字符串逐渐“流”到SLF4J,而不是立即生成所有字符串?
我正在使用类似的代码:
Logger logger = LoggerFactory.getLogger(MyClass.class);
...
ObjectWriter prettyPrintWriter = new ObjectMapper().writerWithDefaultPrettyPrinter();
...
if (logger.isTraceEnabled()) {
try {
String dataString = prettyPrintWriter.writeValueAsString(dataNode);
logger.trace(dataString);
} catch (JsonProcessingException ignored) { }
}
答案 0 :(得分:0)
如果您可以尝试使用logstash-logback-encoder,请创建LogstashMarker的自定义Marker子类并覆盖该方法
public void writeTo(JsonGenerator generator) throws IOException {
..
}
直接编写JSON输出。也许你还需要编写自己的appender。