IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Un fichier de log par thread avec Log4j et log4j.properties


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Par défaut Un fichier de log par thread avec Log4j et log4j.properties
    Bonjour,

    J'ai une application qui est multithread(8 ethreads). Au début je loggais tous les résultats des 8 threads dans un seul fichier. Mais l'ordre des informations présentes dans le fichier de *.log ne me convient pas. Chaque thread écrit quand bon lui semble et les infos des diverses threads sont un peu partout dans le fichier *.log. Pas forcément les unes à la suite des autres (A cause de la préemption je pense). Alors, j'ai voulu que chaque thread crée son propre fichier de log et y stocke ses informations. Pour cela j'ai configuré le fichier log4j.properties comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    log4j.rootLogger=INFO,stdout,fout
     
    log4j.logger1=,stdout,fout
     
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern= %d{ABSOLUTE} [%-5p] %m%n
     
    log4j.appender.fout=org.apache.log4j.FileAppender
    log4j.appender.fout.Append=false
    log4j.appender.fout.File=${monFichier}
    log4j.appender.fout.layout=org.apache.log4j.PatternLayout
    log4j.appender.fout.layout.ConversionPattern=%d{ABSOLUTE} [%-8t] [%-5p] %m%n
    Et dans chaque Thread, je modifie la propriété ${monFichier} comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.setProperty("monFichier",this.getClass().getName() + ".log");
    PropertyConfigurator.configure("resources/log4j.properties");
    Je n'obtiens pas le résultat souhaité. Tous les fichiers de log de chaque Thread sont bien créés. Mais il n'y a qu'un seul fichier qui correspond au dernier thread lancé qui est rempli. A croire que les loggers de chaque thread s'appuient systématiquement sur l'état courant du fichier "log4j.properties". Et comme sa propriété ${monFichier} est modifiée par la dernière thread, son état courant indique donc que le fichier de sortie est celui de la dernière thread.

    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Pourquoi ne pas simplement créér un logger par thread, dirigé vers un appender dédié (dans la config, log4j.logger.<nom du logger>=<LEVEL>, <nom de l'appender> et pour demander le logger dans code logFactory.getInstance(<nom du logger>);.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Par défaut
    Merci pour l'intérêt.
    J'y ai pensé. Mais mon appli va évoluer vers une création du nombre de thread de façon aléatoire. Tantôt 8, voir plus, voir moins. Le nombre de thread deviendra dynamique.
    Et avec cette idée, si j'ai bien compris le nombre appender est déjà figé.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Dans ce cas, créer programmatiquement l'appender pour chaque loger, éventuellement par copie d'un appender type paramétré dans le properties (donc juste à changer dynamiquement le nom du fichier).

    Maintenant, personnellement, j'ai plus de 60 threads dans mon application et je logue tout dans le même fichier, avec le nom du thread dans le pattern, et je filtre ensuite sur le fichier journal. Il y a des outils tout faits qui font ça en plus.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ou créer un appender custom qui fait le travail, ce n'est pas bien sorcier. Il suffit d'étendre AppenderSkeleton

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Dans ce cas, créer programmatiquement l'appender pour chaque loger, éventuellement par copie d'un appender type paramétré dans le properties (donc juste à changer dynamiquement le nom du fichier).

    Maintenant, personnellement, j'ai plus de 60 threads dans mon application et je logue tout dans le même fichier, avec le nom du thread dans le pattern, et je filtre ensuite sur le fichier journal. Il y a des outils tout faits qui font ça en plus.
    Je vais partir sur ta proposition. Je l'ai essayé aujourd'hui. Mais visiblement il y'a un truk qui m'échappe.
    Voici mon fichier de log4j.properties
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    # initialize root logger with level ERROR for stdout and fout
    log4j.rootLogger=INFO,stdout
    # add a ConsoleAppender to the logger stdout to write to the console
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    # use a simple message format
    log4j.appender.stdout.layout.ConversionPattern= %d{ABSOLUTE} [%-5p] %m%n
     
    log4j.logger.dev=INFO,fout
    # add a FileAppender to the logger fout
    log4j.appender.fout=org.apache.log4j.FileAppender
    # create a log file
    #log4j.appender.fout.Append=false
    log4j.appender.fout.File=devsrv.log
    #log4j.appender.fout.File=${monFichier}
    log4j.appender.fout.layout=org.apache.log4j.PatternLayout
    # use a more detailed message pattern
    log4j.appender.fout.layout.ConversionPattern=%d{ABSOLUTE} [%-8t] [%-5p] %m%n
    où je définis le logger père com.dev.
    Voici le premier code JAVA où j'essaie de modifier l'APPENDER directement dans le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    logger = Logger.getLogger(com.dev.thread1);
    PropertyConfigurator.configure("resources/log4j.properties");
    FileAppender myFApp = (FileAppender) logger.getAppender(InfoBoxSrv.FILE_APPENDER);
    myFApp.setFile(this.getClass().getName() + ".log");
    Ca ne marche. Après investigation, je me suis rendu compte que le logger fils com.dev.thread1 (héritier du logger père com.dev) n'a pas d'appender propre à lui (null).
    Du coup j'ai modifié mon code comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    logger = Logger.getLogger(com.dev.thread1);
    PropertyConfigurator.configure("resources/log4j.properties");
    FileAppender myFApp = (FileAppender)logger.getParent().getAppender(InfoBoxSrv.FILE_APPENDER);
    FileAppender file = new FileAppender();
    file.setFile(this.getClass().getName() + ".log");
    file.setLayout(myFApp.getLayout());
    file.setName(myFApp.getName());
    logger.addAppender(file);
    Toujours rien de concluant. Le fichier de sorti est bien créé mais il est vide. Une erreur dans mon code ?

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hsmr Voir le message
    Toujours rien de concluant. Le fichier de sorti est bien créé mais il est vide. Une erreur dans mon code ?
    Dans ton thread tu logues bien sur ce logger (que tu décris dans ton code, qui devrait être logger = Logger.getLogger(une chaîne unique par thread (et pas la classe));.
    La solution proposée par @Tchize_ a l'avantage de ne pas avoir à intervenir sur la façon de sélectionner le logger dans le code du thread (tous les threads loguent dans le même logger, mais c'est l'appender custom qui redirige vers un fichier différents selon le thread émetteur).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [log4j] un fichier de logs par mois
    Par toine62 dans le forum Logging
    Réponses: 5
    Dernier message: 03/03/2009, 12h28
  2. [log4j] Un fichier de log par utilisateur (thread)
    Par El Saigneur dans le forum Logging
    Réponses: 0
    Dernier message: 12/12/2008, 16h08
  3. Un fichier de log par utilisateur
    Par jpclavery dans le forum Logging
    Réponses: 1
    Dernier message: 25/01/2008, 13h58
  4. [Log4] Produire un fichier de log par utilisateur
    Par hugo123 dans le forum Logging
    Réponses: 2
    Dernier message: 11/08/2006, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo