我需要将消息记录到应该在运行时创建的不同日志文件,具体取决于我在启动作业时传递的作业参数。例如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运行命令。
它不起作用,没有创建日志文件,如果我们手动创建并提供完整权限,仍然没有记录任何日志文件。
答案 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对象。 (我需要基本上为每个服务执行上面的行)..
这对你有帮助吗?