2010-10-12 20 views
4

Dans mon projet j'ai une classe abstraite de premier niveau FrameProducer. J'ai ajouté un enregistreur slf4j à ce niveau, de sorte que chaque classe héritière l'ait déjà. Voici le code:Comment initialiser logger slf4j (en utilisant log4j) correctement dans les classes abstraites/pour l'héritage

public abstract class FrameProducer extends Observable { 

    protected final Logger logger = LoggerFactory.getLogger(this.getClass()); 

    protected BufferedImage frame; 

    public BufferedImage getFrame() { 
     return frame; 
    } 

    public void fireEvent() { 
     logger.debug("Firing event. Implementing class: {}", this.getClass()); 
     setChanged(); 
     notifyObservers(); 
    } 
} 

Il y a aussi deux classes héritant: CameraFrameGrabber et GrayscaleFilter. Pourtant, lorsque la méthode fireEvent() est appelée de CameraFrameGrabber ou GrayscaleFilter le message est en cours d'enregistrement au niveau FrameProducer. Ici le journal, pour plus de clarté:

FrameProducer.fireEvent - Firing event. Implementing class: class com.ofj.frameaccess.CameraFrameGrabber 
FrameProducer.fireEvent - Firing event. Implementing class: class com.ofj.frameaccess.GrayscaleFilter 

Est-il possible d'initialiser l'enregistreur à FrameProducer de manière que tout se connecté au niveau le plus spécialisé dans ma hiérarchie de classes?

Merci pour toute aide.


Edit: Mon log4j.properties ressemble à ceci:

log4j.rootCategory=TRACE, CONSOLE 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Threshold=DEBUG 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%C{1}.%M - %m%n 
+0

Cela devrait se faire par défaut. À quoi ressemble votre fichier 'log4j.properties' ou' log4j.xml'? – skaffman

Répondre

0

Merci de remarquer la bonne direction pour chercher skaffman possible des corrections. J'ai finalement changé log4j.properties à (comme l'un des exemples dans le PatternLayout documentation dit):

log4j.rootCategory=TRACE, CONSOLE 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Threshold=DEBUG 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%-6r [%15.15t] %-5p %30.30c %x - %m%n 

... et tout est connecté à droite.

+0

Ne fait aucune différence pour moi ... –

7

La consignation de classes abstraites est considérée par certains comme un anti-pattern car elle introduit une dépendance potentiellement inattendue. Cependant, si vous êtes sûr que tout ce que vous avez affaire est le vôtre, je suppose que ce n'est pas un problème.

Si vous voulez obtenir le message du journal pour montrer la mise en œuvre concrète plutôt que le nom de classe abstraite (ce qui est logique), puis changer votre instruction d'initialisation de l'enregistrement dans la classe abstraite:

private final Logger logger = LoggerFactory.getLogger(getClass()); 

au lieu de quelque chose comme:

private static final Logger logger = LoggerFactory.getLogger(MyAbstractClass.class); 

-à-dire

  • pas statique, car il pourrait être jeté à autre chose.
  • getClass() au lieu de la classe spécifique