2016-07-28 50 views
0

Ich versuche, meine Logs in JSON-Dateien mit Log4J (2.6.2) zu speichern. Ich verwende eine JsonLayout in einer RollingFileAppender, und es funktioniert ordnungsgemäß, solange ich nicht an eine Datei anhängen, die bereits zuvor geschrieben wurde.Log4J - JsonLayout und RollingFileAppender generieren ungültige JSON

Hier ist mein Code für das Layout der Einrichtung und die Appender:

Layout<?> layout = JsonLayout.createLayout(config, false, false, false, true, false, true, "[", "]", Charset.defaultCharset()); 

String appenderFileName = "mylogfile-latest.log.json"; 
String appenderFilePattern = "mylogfile-%i.log.json"; 
String appenderName = "MyAppender"; 
Appender appender = RollingFileAppender.createAppender(appenderFileName, appenderFilePattern, "true", appenderName, "true", "256", "true", 
     SizeBasedTriggeringPolicy.createPolicy(this.configuration.getLogMaxSize().toString()), 
     null, layout, null, "false", "false", null, config); 

Wie gesagt, es funktioniert gut das erste Mal, dass ich in meiner Log-Datei Ich schreibe:

[ 
    { 
    "timeMillis" : 1469620840442, 
    "thread" : "SimpleAsyncTaskExecutor-43", 
    "level" : "ERROR", 
    "loggerName" : "MyLogger", 
    "message" : "my log message", 
    "endOfBatch" : false, 
    "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger", 
    "threadId" : 243, 
    "threadPriority" : 5 
    } 
    , { 
    "timeMillis" : 1469620840442, 
    "thread" : "SimpleAsyncTaskExecutor-43", 
    "level" : "DEBUG", 
    "loggerName" : "MyLogger", 
    "message" : "my log message", 
    "endOfBatch" : false, 
    "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger", 
    "threadId" : 243, 
    "threadPriority" : 5 
    } 
] 

I Schließen Sie dann meinen Appender, etc ... und starten Sie meine Anwendung neu, und wenn ich neue Protokolle in diese vorhandene Datei schreibe, hier ist, was ich bekomme:

[ 
{ 
    "timeMillis" : 1469620840442, 
    "thread" : "SimpleAsyncTaskExecutor-43", 
    "level" : "ERROR", 
    "loggerName" : "MyLogger", 
    "message" : "my log message", 
    "endOfBatch" : false, 
    "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger", 
    "threadId" : 243, 
    "threadPriority" : 5 
} 
, { 
    "timeMillis" : 1469620840442, 
    "thread" : "SimpleAsyncTaskExecutor-43", 
    "level" : "DEBUG", 
    "loggerName" : "MyLogger", 
    "message" : "my log message", 
    "endOfBatch" : false, 
    "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger", 
    "threadId" : 243, 
    "threadPriority" : 5 
} 

] 
{ 
    "timeMillis" : 1469620840490, 
    "thread" : "SimpleAsyncTaskExecutor-43", 
    "level" : "ERROR", 
    "loggerName" : "MyLogger", 
    "message" : "my log message", 
    "endOfBatch" : false, 
    "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger", 
    "threadId" : 245, 
    "threadPriority" : 5 
    } 
    , { 
    "timeMillis" : 1469620840492, 
    "thread" : "SimpleAsyncTaskExecutor-43", 
    "level" : "DEBUG", 
    "loggerName" : "MyLogger", 
    "message" : "my log message", 
    "endOfBatch" : false, 
    "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger", 
    "threadId" : 245, 
    "threadPriority" : 5 
    } 

] 

Dieses Problem macht es unmöglich, die Protokolle zu analysieren, da Gson keine List aus dieser Datei erstellen kann.

Haben Sie eine Idee, wie Sie dieses Problem beheben können, ohne einen beschissenen Hack zu machen, indem Sie das extra ] entfernen und durch ein Komma ersetzen?

Danke!

Antwort

0

Da keine andere Lösung befriedigend war, landete ich einen regulären Ausdruck nach oben mit den ungültigen Zeichen zu ersetzen ...

Es ist ziemlich sicher, da es überprüft, ob es nicht zwischen zwei doppelten Anführungszeichen ist, aber es ist nicht die ideale lösung offensichtlich:

1

Der Grund, warum das JSONLayout dies tut, ist ein "wohlgeformtes" JSON-Dokument zu erstellen. Sie müssen jedes Dokument in eine eigene Datei (mit Anfangs- und Endklammer) setzen, damit dies zutrifft, was hier nicht der Fall ist.

Sie haben zwei Möglichkeiten:

  1. Für JSONLayout, Satz komplett = false (Sie haben es wie in Ihrem Beispiel wahr), die es aus, ohne gedruckt wird ‚[‘ und ‚]‘. Sie können diese Zeichen dann vor dem Aufruf von GSON selbst hinzufügen (da die Datei kein Array enthält).
  2. Erstellen Sie Ihr eigenes JSONLayout (Sie müssen AbstractStringLayout erweitern) mit etwas einfach wie org.json: json oder GSON, um die Zeichenfolge für die Datei zu erhalten.