2017-04-19 25 views
0

我在内存中有一些大型的Jackson JsonNode对象。为了调试/跟踪的目的,我使用SLF4J-Logback以适当的日志级别记录这些日志。增量记录大型JSON对象到SLF4J

这会导致OutOfMemory异常和崩溃,因为输出字符串的大小很大。请注意,这些JsonNode对象已经在内存中,所以它不是解析问题。

有没有什么办法让Jackson逐渐将漂亮的字符串“串流”到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

另外Log4j'Logger'似乎没有提供流式操作,并且日志消息很可能应该写入保卫者中,整个消息写入日志。如果你只写了'JsonNode'的第一个_n_字符会怎么样? –

+0

@LyubomyrShaydariv我们使用SLF4J的Logback实现。这只是调试/追踪,日志中的数据完整性并不是一个大问题。您可以轻松判断JSON是否部分打印。 – metacubed

回答

0

如果你可以尝试使用logstash-的logback编码器,创建LogstashMarker的自定义标记子类覆盖的方法

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

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