2017-09-22 14 views
0

J'utilise logback et j'ai besoin de consigner toutes les données interrogées par les clients dans un fichier journal. Toutes les données demandées par les clients doivent être enregistrées dans le même fichier. Le processus d'enregistrement ressemble simplement ci-dessous:Enregistrement d'une chaîne de grande taille dans 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); 
} 

Il fonctionne généralement bien, mais parfois, il se pose OutOfMemoryError avec l'appel de toString à la variable outputMap lorsque les données est trop grand pour faire une chaîne. Donc, je veux que ça marche de façon à ce que le streaming se fasse sans problème de performance. " Et je ne sais pas comment le faire efficacement et gracieusement.

Une idée?

Répondre

0

Boucle sur la carte pour que vous ne travaillez avec une petite partie à la fois:

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

(Suppose Java 8 et SLF4J)

Toutefois, si la carte est assez grand pour la Si vous envoyez du code pour générer des MOO, vous devez probablement vérifier s'il est approprié de le consigner dans un tel détail, ou si votre service doit limiter la taille de la réponse.