2017-04-19 21 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。