2017-09-22 11 views
0

私はlogbackを使用しています。クライアントから照会されたすべてのデータをログファイルに記録する必要があります。クライアントが照会するすべてのデータは、同じファイルに記録する必要があります。ロギングプロセスは、単純に以下のようになります。大きなサイズの文字列をJavaでログに記録

private static final OUTPUTFILELOGGER = Logger.getLogger(...); 
String outputString = null; 
try { 
    Map<String, Object> outputMap = doService(); // queries data requested by clients. 
    .... // do something after business logic.. 
    outputLog = outputMap.toString(); // critical!! 
} catch (Throwable e) { 
    handling exception 
} finally { 
    OUTPUTFILELOGGER.info(outputString); 
} 

それは通常、正常に動作しますが、要求されたデータは、文字列を作るには大きすぎるとき時にはそれがoutputMap変数へのtoStringの呼び出しでOutOfMemoryErrorが発生します。

私はそれをパフォーマンスに問題なくストリーミングの仕方で動作させたいと思っています。そして私はそれを効果的かつ優雅にする方法を知らない。

マップはのために十分な大きさである場合

LOGGER.info("Map contains:") 
map.forEach((key, value) -> LOGGER.info("{}: {}", key, value)); 

(Javaの8想定しており、SLF4J)しかし

:あなたが一度に小さな部分で作業しているように、マップを通じて

答えて

0

ループあなたがOOMを生成するために与えたコードであれば、それを詳細に記録するのが適切かどうか、あるいはあなたのサービスがレスポンスの大きさを決めるべきかどうかを考えなければならないでしょう。

関連する問題