2017-04-19 15 views
0

大きなジャクソンのJsonNodeオブジェクトがメモリにあります。デバッグ/トレースの目的で、適切なログレベルでSLF4J-Logbackを使用してこれらのログを記録しています。大きなJSONオブジェクトをSLF4Jに段階的に記録する

出力文字列のサイズが大きいため、OutOfMemoryの例外とクラッシュが発生します。これらのJsonNodeオブジェクトはすでにメモリに格納されているため、解析の問題ではありません。

きれいに印刷された文字列を徐々にすべてを生成するのではなく、SLF4Jに徐々に "ストリーム"する方法はありますか?私はこのようなコード使用してい

:あなたはlogstash-logback-エンコーダを使用して試すことができた場合

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'はストリーミング操作を提供していないようで、ログメッセージはguaraneteeに書き込まれたものとみなされ、メッセージ全体がログに書き込まれます。 'JsonNode'の最初の_n_文字だけを書くとどうなりますか? –

+0

@LyubomyrShaydariv私たちはSLF4JのLogback実装を使用します。これは単なるデバッグ/トレースであり、ログのデータの完全性は大きな問題ではありません。 JSONが部分的に印刷されているかどうかを簡単に知ることができます。 – metacubed

答えて

0

、方法をLogstashMarkerのカスタムマーカーのサブクラスを作成して、上書きを

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

へあなたのJSON出力を直接記述してください。おそらくあなた自身のアペンダーも書く必要があります。

関連する問題