2017-04-19 1 views
0

Ich habe einige große Jackson JsonNode Objekte im Speicher. Zu Debugging-/Tracing-Zwecken protokolliere ich diese mit SLF4J-Logback auf entsprechenden Log-Ebenen.Große JSON-Objekte in SLF4J inkrementell protokollieren

Dies verursacht OutOfMemory-Ausnahmen und stürzt ab, aufgrund der großen Größe der Ausgabezeichenfolge. Beachten Sie, dass sich diese -Objekte bereits im Speicher befinden, daher handelt es sich nicht um ein Analyseproblem.

Gibt es irgendeine Möglichkeit für Jackson, die hübsch gedruckte Zeichenkette inkrementell in SLF4J "streamen" zu lassen, anstatt sie auf einmal zu erzeugen?

I-Code bin mit diesem ähnlich ist:

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

Können Sie den genauen StackTrace angeben? –

+0

Auch Log4j 'Logger' scheint keine Streaming-Operationen zu bieten, und Log-Nachrichten werden höchstwahrscheinlich auf einmal geschrieben, um sicherzustellen, dass die gesamte Nachricht in das Protokoll geschrieben wird. Was ist, wenn Sie nur die ersten _n_ Zeichen des 'JsonNode' schreiben? –

+0

@LyubomyrShaydariv verwenden wir die Logback-Implementierung von SLF4J. Und das ist nur Debuggen/Tracing, Datenintegrität in Protokollen ist keine große Sorge. Sie können leicht feststellen, ob JSON teilweise gedruckt wird. – metacubed

Antwort

0

Wenn Sie versuchen können, eine benutzerdefinierten Marker Unterklasse von LogstashMarker logstash-logback-Encoder verwenden, erstellen und überschreibt die Methode

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

zu schreibe deine JSON-Ausgabe direkt. Vielleicht müssen Sie auch Ihren eigenen Appender schreiben.

Verwandte Themen