spring批量日志根据批次ID登录到不同的日志文件?

时间:2014-07-01 12:20:13

标签: java spring spring-mvc logging spring-batch

我需要将消息记录到应该在运行时创建的不同日志文件,具体取决于我在启动作业时传递的作业参数。例如batch_id = 2014-07-01等。

我遇到了https://github.com/dsyer/log4j-utils,在测试用例的帮助下,https://github.com/dsyer/log4j-utils/blob/master/src/test/resources/file-dispatcher.xml尝试在我的spring批处理管理项目中进行配置。以下是配置

<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批处理作业中通过spring batch itemWriter运行命令。

它不起作用,没有创建日志文件,如果我们手动创建并提供完整权限,仍然没有记录任何日志文件。

2 个答案:

答案 0 :(得分:0)

它对我有用。在你的代码中     NDC.clear(); 不见了。 这可能是文件未生成的原因。

答案 1 :(得分:0)

我目前正在实施您所说的内容,但采用了不同的方法。 我已经定义了一个JobLoggerGenerator类,它为每个被调用的类创建一个appender:

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

然后,在我的Service类中,例如,我将声明一个Logger对象,我将这样修改:

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

不是微妙的方法是在正确的时间初始化JobExecutionId。 在Spring-batchs&#39;例如,在初始化@Service类之后调用@BeforeStep,因此使用@PostConstruct的init方法在这里不起作用。

我需要做的是将@BeforeStep方法进一步修改为1)初始化de JobExecutionId,以及2)调用我需要记录的每个服务或dao类,添加一个追加到Logger对象。 (我需要基本上为每个服务执行上面的行)..

这对你有帮助吗?