2014-07-01 3 views
2

J'ai besoin de consigner des messages dans différents fichiers journaux qui doivent être créés lors de l'exécution en fonction du paramètre de travail que je transmets lors du lancement du travail. par exemple batch_id = 2014-07-01 etcjournal de lot de printemps à différent fichier journal en fonction de l'ID de lot?

Je suis tombé sur https://github.com/dsyer/log4j-utils et avec l'aide du cas de test, https://github.com/dsyer/log4j-utils/blob/master/src/test/resources/file-dispatcher.xml essayé de configurer dans mon projet d'administration par lots de printemps. Ci-dessous la configuration

<appender name="LOGGER" class="org.springframework.util.log4j.DispatcherAppender"> 
    <param name="propertyName" value="file" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="/var/log/st/batch.log.%x" /> 
    </layout> 
    <appender-ref ref="FILE" /> 
</appender> 

<appender name="FILE" class="org.apache.log4j.FileAppender"> 
    <param name="file" value="/var/log/st/default.log" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%5p: %m%n" /> 
    </layout> 
</appender> 

<root> 
    <priority value="info" /> 
    <appender-ref ref="LOGGER" /> 
</root 

et dans ma classe, je me sers

import org.apache.commons.lang3.StringUtils; 
import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 
import org.apache.log4j.NDC; 

public class MyClass implements MyInterface { 

    Logger logger = Logger.getLogger(MyClass.class); 

    public void run(final String command, final long timeout) throws Exception { 

     NDC.push("2014-07-01"); 

     logger.info("Running " + command); 


    } 
} 

J'utilise cette classe pour exécuter des commandes par itemWriter de lot de printemps en traitement par lots de printemps.

Cela ne fonctionne pas, aucun fichier journal n'est créé et si nous créons manuellement et donnons des autorisations complètes, rien n'est enregistré dans les fichiers journaux.

Répondre

0

Cela fonctionne pour moi. Dans votre code NDC.clear(); est manquant. Cela peut être une raison pour laquelle le fichier n'est pas généré.

0

Je suis actuellement en train de mettre en œuvre ce que vous avez indiqué, mais avec une approche différente. J'ai défini une classe JobLoggerGenerator qui crée une appender pour chaque classe, il est appelé comme ceci:

public static Appender getJobAppender(Class<?> class_) { 

    PatternLayout layout = new PatternLayout(
     logProperties.getProperty("log4j.appender.LogFile.layout.ConversionPattern")); 

    FileAppender appender = null; 
    try { 
     // vérifier l'existance du paramétre 
     if (UtilBatch.chaineVide(cheminExecutionJob)) { 
      throw new IOException("Le chemin de depôt des fichiers est vide"); 
     } 

     // vérifier et créer le dossier des traces 
     String cheminDepotFichTraces = UtilBatch.verifierEtCreerChemin(cheminExecutionJob, "log"); 

     // ajouter le fichier des traces pour ce job 
     appender = new FileAppender(layout, 
      UtilBatch.creerLien(cheminDepotFichTraces, jobExecutionId + "_log.log"), true); 
     appender.setEncoding(logProperties.getProperty("log4j.appender.LogFile.Encoding")); 

    } catch (Exception e) { 
     Logger mainLog = Logger.getLogger(class_); 
     mainLog.error(jobExecutionId, e); 
    } 

    return appender; 
} 

Puis, dans ma classe de service par exemple, je vais avoir un objet Logger déclaré que je modifierai comme donc:

log.addAppender(JobLoggerGenerator.getJobAppender(TestsServiceImpl.class)); 

L'approche subtile ne consiste pas à initialiser JobExecutionId au bon moment. Dans le cas de Spring-batchs, @BeforeStep est appelé APRES l'initialisation des classes @Service, de sorte qu'une méthode init avec @PostConstruct ne fonctionnera pas ici. Ce que je dois faire à la place, est de modifier la méthode @BeforeStep pour 1) initialiser de JobExecutionId, et 2) pour appeler chaque service ou classe dao dans lequel j'ai besoin de connecter quelque chose, pour ajouter un appender à l'objet Logger. (J'ai besoin d'exécuter la ligne ci-dessus pour chaque service essentiellement) ..

Est-ce que cela vous aide?

Questions connexes