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

Logging Java Discussion :

[Log4J][Héritage] Création d’une classe de log personnalisée


Sujet :

Logging Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut [Log4J][Héritage] Création d’une classe de log personnalisée
    Bonjour,

    J’ai dû rater une subtilité grosse comme une poutre, mais je dois admettre que cela me laisse dubitatif.
    J’ai créé une classe destiné, à terme, à ma faciliter la gestion des logs (basés sur Log4J).

    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
     
    import org.apache.log4j.*;
     
    public class Log extends Logger {
     
        static final Logger logger = Logger.getLogger("MonLog");
     
        /** Creates a new instance of Log */
        protected Log(String name) {
            super(name);
            BasicConfigurator.configure();
            logger.setLevel(Level.INFO);
        }
     
    /* …
    Je compte placer ici mes fonctions perso 
    */
    }
    Comme vous le constatez, cette classe hérite de org.apache.log4j.Logger.

    Lorsque j’utilise cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public static void main(String args[]) {
            Log log = new Log("MonLog");
            log.info("Mon texte à afficher");
        }
    Je me retrouve avec une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Exception in thread "main" java.lang.NullPointerException
            at org.apache.log4j.Category.info(Category.java:753)
            at TstMain.main(TstMain.java:21)
    Java Result: 1
    Alors que si je complète ma classe Log avec une méthode info() qui se contente de faire appel à son homologue dans Logger :
    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
    20
    21
    22
    23
    import org.apache.log4j.*;
     
    public class Log extends Logger {
     
        static final Logger logger = Logger.getLogger("MonLog");
     
        /** Creates a new instance of Log */
        protected Log(String name) {
            super(name);
            BasicConfigurator.configure();
            logger.setLevel(Level.INFO);
        }
     
      public void info(Object message) {
          logger.info(message);
      }
     
    /* …
    Je compte placer ici mes fonctions perso 
    */
     
    }
    Cela fonctionne très bien.

    Bref, il y a-t-il une subtilité dans la classe Logger que je n’aurais pas perçu ?
    Celle-ci héritant de la classe Category (qui implémente la méthode info()), je trouve normal de pouvoir acceder à la méthode depuis un objet Logger. Cependant, je ne vois pas pourquoi mon objet Log (héritant lui-même de Logger) ne peux pas exploiter la méthode info() sans avoir à la redéfinir.

    Quelqu’un est-il plus inspiré que moi ?

    Chris

  2. #2
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Je constate que ma question n’a pas inspiré grand monde sur cette partie du forum, je vais donc tenter ma chance sur une partie plus générale de Java [http://www.developpez.net/forums/sho....php?t=210799].

  3. #3
    Membre émérite Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Par défaut
    En lisant ton code, j'ai plus l'impression que tu as rajouter une couche au dessus de ton logger plutot que tu as fais de l'heritage.

    Ce qui me fait penser à ca, c'est cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static final Logger logger = Logger.getLogger("MonLog");

  4. #4
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    En fait, il s’agit d’une bidouille inopportune (au moins dans le cadre de cet exemple).
    A la base, je souhaitais tenter un petit mixte des deux.
    Mais tu as raison, je m’y suis mal pris, et j’ai ainsi initialisé le mauvais contexte.
    Je vais revoir ma copie.

    Merci pour tes lumières.

    Chris.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 14
    Par défaut
    Tu peux t'y prendre comme tu as fais, mais il suffit à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void info(Object message) {
          logger.info(message);
    }
    de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void info(Object message) {
          logger.log(this.getClass().getName(), Level.INFO, message, null);
    }
    Cf la javadoc sur la méthode log(String callerFQCN, Priority level, Object message, Throwable t) pour les explications...

  6. #6
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Citation Envoyé par stepmaniac
    Tu peux t'y prendre comme tu as fais, mais il suffit à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void info(Object message) {
          logger.info(message);
    }
    de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void info(Object message) {
          logger.log(this.getClass().getName(), Level.INFO, message, null);
    }
    Cf la javadoc sur la méthode log(String callerFQCN, Priority level, Object message, Throwable t) pour les explications...
    Je te remercie stepmaniac, en fait, je suis parti sur une solution plus simple de délégation.

    Mais je dois admettre ma grande faute : d'une part, je n'en avais pas fait mention, mais en plus, je n'avais pas taggé la discution comme [Résolu].
    Je m'en vais y remédier.

    A+,
    Chris.

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

Discussions similaires

  1. Différentes créations de classes : héritage ou pas
    Par MicBeastKiller dans le forum C++
    Réponses: 16
    Dernier message: 04/05/2012, 16h56
  2. Réponses: 3
    Dernier message: 23/05/2007, 12h35
  3. Réponses: 1
    Dernier message: 26/05/2005, 12h24
  4. Création d’une icône sur desktop PC
    Par Enrique dans le forum Windows
    Réponses: 6
    Dernier message: 03/12/2004, 10h56

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