Nous avons mis en place quelque chose de similaire dans notre système. Nous stockons les enregistreurs spécifiques dans un HashMap et initialisons des appenders pour chacun d'entre eux selon les besoins.
Voici un exemple :
public class JobLogger {
private static Hashtable<String, Logger> m_loggers = new Hashtable<String, Logger>();
private static String m_filename = "..."; // Root log directory
public static synchronized void logMessage(String jobName, String message)
{
Logger l = getJobLogger(jobName);
l.info(message);
}
public static synchronized void logException(String jobName, Exception e)
{
Logger l = getJobLogger(partner);
l.info(e.getMessage(), e);
}
private static synchronized Logger getJobLogger(String jobName)
{
Logger logger = m_loggers.get(jobName);
if (logger == null) {
Layout layout = new PatternLayout("...");
logger = Logger.getLogger(jobName);
m_loggers.put(jobName, logger);
logger.setLevel(Level.INFO);
try {
File file = new File(m_filename);
file.mkdirs();
file = new File(m_filename + jobName + ".log");
FileAppender appender = new FileAppender(layout, file.getAbsolutePath(), false);
logger.removeAllAppenders();
logger.addAppender(appender);
}
catch (Exception e)
{ ... }
}
return logger;
}
}
Ensuite, pour l'utiliser dans votre travail, il vous suffit d'utiliser une entrée d'une ligne comme celle-ci :
JobLogger.logMessage(jobName, logMessage);
Cela créera un fichier journal pour chaque nom de travail et le déposera dans son propre fichier avec ce nom de travail dans le répertoire que vous aurez spécifié.
Vous pouvez jouer avec d'autres types d'appenders et autres. Tel qu'il est écrit, il continuera d'appender jusqu'à ce que la JVM soit redémarrée, ce qui peut ne pas fonctionner si vous exécutez le même travail sur un serveur qui est toujours en marche, mais cela donne une idée générale de la façon dont cela peut fonctionner.