以递增方式将大型JSON对象记录到SLF4J

时间:2017-04-19 03:20:48

标签: java json logging out-of-memory slf4j

我在记忆中有一些大的杰克逊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) { }
}

1 个答案:

答案 0 :(得分:0)

如果您可以尝试使用logstash-logback-encoder,请创建LogstashMarker的自定义Marker子类并覆盖该方法

public void writeTo(JsonGenerator generator) throws IOException { 
   ..
}

直接编写JSON输出。也许你还需要编写自己的appender。