2014-07-01 35 views
2

我需要將消息記錄到應該在運行時創建的不同日誌文件,具體取決於啓動作業時傳遞的作業參數。例如batch_id = 2014-07-01等根據批次ID彈簧批次日誌到不同的日誌文件?

我遇到了https://github.com/dsyer/log4j-utils並且在測試用例的幫助下,https://github.com/dsyer/log4j-utils/blob/master/src/test/resources/file-dispatcher.xml試圖在我的spring batch admin項目中進行配置。下面是配置

<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 

,並在我的課,我使用

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


    } 
} 

我使用這個類來運行春季批處理作業通過Spring Batch的itemWriter命令。

它不工作,沒有創建日誌文件,如果我們手動創建並給出完整權限,則仍然沒有任何內容記錄到日誌文件中。

回答

0

它適合我。在你的代碼中 NDC.clear();缺少 。 這可能是文件未生成的原因。

0

我目前正在實施您所述的內容,但採用了不同的方法。 我定義爲每個類,它被稱爲像這樣創建一個appender一個JobLoggerGenerator類:

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

然後,在我的服務類的例子,我將有一個Logger對象中聲明,我將像修改所以:

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

不是微妙的方法是在正確的時間初始化JobExecutionId。 在Spring-batchs的情況下,在初始化@Service類之後調用@BeforeStep,所以帶@PostConstruct的init方法在這裏不起作用。

我不得不做的是,將@BeforeStep方法進一步修改爲1)初始化de JobExecutionId,以及2)調用每個服務或dao類,在其中需要記錄某些內容,添加appender到Logger對象。 (我需要執行上面的每一項服務基本線)

這是否有幫助嗎?