2016-07-28 5 views
0

Log4J(2.6.2)を使用してJSONファイルにログを保存しようとしています。私はRollingFileAppenderJsonLayoutを使用しています。すでに書かれているファイルに追加しようとしていない限り、正しく動作しています。Log4J - JsonLayoutとRollingFileAppenderが無効なJSONを生成しています

はここでレイアウトとアペンダを設定するための私のコードです:

[ 
    { 
    "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:

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); 

私が言ったように、それは罰金、私は私のログファイルに書いている最初の時間を働いています私のアペンダーなどを閉じてアプリケーションを再起動してください。この既存のファイルに新しいログを書き込んでいるときは、ここにあります:

[ 
{ 
    "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 
    } 

] 

この問題により、GsonがこのファイルからListを作成できないため、ログを解析することができなくなります。

]を削除して厄介なハックを実行せずにこの問題を解決する方法がありますか?それをコンマで置き換えてください。

ありがとうございます!

答えて

0

他の解決策は満足ではなかったので、私は無効な文字を置き換えるために正規表現を使用して終了...

、2つの二重引用符の間にない場合、それはチェックするので、それはかなり安全だが、そうではありません明らかに理想的な解決法:

String content = new String(Files.readAllBytes(Paths.get(pathToLogFile))); 
content = content.replaceAll("(\\}\\R{2}\\]\\R\\{)(?=(?:(?:\\.|[^\"\\\\])*\"(?:\\.|[^\"\\\\])*\")*(?:\\.|[^\"\\\\])*)", "}\n, {"); 
Files.write(Paths.get(pathToLogFile), content.getBytes()); 
1

JSONLayoutがこれを行う理由は、「整形式の」JSONドキュメントを作成するためです。これが真であるためには、各文書を独自のファイル(開始括弧と終了括弧)に入れる必要がありますが、ここではそうではありません。 JSONLayoutについては

  1. 、設定偽=完全に「[」と「]」せずに、それをプリントアウトれる(あなたがサンプルでそれが真として持っている):

    は、2つのオプションがあります。 GSONを呼び出す前に、これらの文字を自分で追加することができます(ファイルには配列がありません)。

  2. org.json:jsonやGSONのような単純なものを使って独自のJSONLayout(AbstractStringLayoutを拡張する必要があります)を作成して、ファイルの文字列を取得します。
関連する問題