14 votes

noms des fichiers journaux de log4j ?

Nous avons plusieurs tâches qui s'exécutent simultanément et qui doivent utiliser les mêmes informations de configuration pour log4j. Ils déversent tous les journaux dans un fichier en utilisant le même appender. Existe-t-il un moyen de faire en sorte que chaque tâche nomme dynamiquement son fichier journal afin qu'ils restent séparés ?

Merci
Tom

21voto

shadit Points 1975

Pouvez-vous passer une propriété du système Java pour chaque travail ? Si oui, vous pouvez paramétrer comme ceci :

java -Dmy_var=somevalue my.job.Classname

Et ensuite dans votre log4j.properties :

log4j.appender.A.File=${my_var}/A.log

Vous pourriez remplir la propriété système Java avec une valeur provenant de l'environnement de l'hôte (par exemple) qui identifierait de manière unique l'instance du travail.

3voto

Asgeir S. Nilsen Points 805

Si les noms des tâches sont connus à l'avance, vous pouvez inclure le nom de la tâche lorsque vous faites l'appel getLogger(). Vous pouvez alors lier différents appenders à différents loggers, avec des noms de fichiers (ou autres destinations) distincts.

Si vous ne pouvez pas connaître le nom du travail à l'avance, vous pouvez configurer l'enregistreur au moment de l'exécution au lieu d'utiliser un fichier de configuration :

FileAppender appender = new FileAppender();
appender.setFileName(...);
appender.setLayout(...);
Logger logger = Logger.getLogger("com.company.job."+jobName);
logger.addAppender(appender);

3voto

18Rabbit Points 1646

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.

2voto

Vous pouvez faire en sorte que chaque tâche définisse NDC ou MDC, puis écrire un appender qui varie le nom en fonction de la valeur NDC ou MDC. La création d'un nouvel appender n'est pas très difficile. Il peut également y avoir un appender qui fera l'affaire dans la sandbox de log4j. Commencez à chercher dans http://svn.apache.org/viewvc/logging/log4j/trunk/contribs/

1voto

erickson Points 127945

Vous pourriez écrire votre propre appender qui crée son propre nom de fichier, peut-être en utilisant la méthode [File.createTempFile]( http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createTempFile(java.lang.String,%20java.lang.String))) méthode. Si le FileAppender a été écrite correctement, vous devriez pouvoir l'étendre - ou RollingFileAppender -et de remplacer le getFile pour renvoyer une méthode que vous choisissez en fonction des nouvelles propriétés que vous souhaitez ajouter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X