J'ai une application graphique dans swing, implémentée dans NetBeans. Pour les diverses fonctionnalités fournies à partir de l'entrée de l'utilisateur, un jar est utilisé, qui utilise log4j pour la journalisation. Tout va bien, mais je dois rediriger les informations de log4j vers une zone de texte dans mon interface graphique. J'ai trouvé que pour rediriger de log4j à swing zone de texte, il faut étendre un AppenderSkeleton. Mon problème est que je ne peux pas modifier le gui (afin d'avoir un JTextArea qui étend un AppenderSkeleton par exemple) donc je dois avoir une telle classe qui s'ajoute à ma JTextarea. Maintenant, mon application initialise avant log4j. Mon problème est que je ne peux pas trouver un moyen de définir comme propriété la classe personnalisée AppenderSkeleton, une référence à la zone jtext de mon gui, de sorte que lorsque log4j initialise l'appender, il passera une référence à la zone de texte de l'application. J'ai essayé dans le fichier de configuration log4J quelque chose comme: log4j.appender.myAppender.theTextArea = path.to.myFrameclass.theTextArea sautant que log4j appelait le setter dans mon appender et le getter de mon cadre pour définir la zone de texte, mais ça ne marche pas. Comment rendre l'appender initialisé par log4j, rediriger les informations vers mon application? Ou est-il possible pour mon application d'initialiser l'appender personnalisé et d'informer log4j de l'utiliser pour la consignation? Merci!log4j redirection vers l'application de bureau en balançoire
3
A
Répondre
4
L'option la plus simple consiste à ajouter par programme votre appender une fois que votre interface graphique a été initialisée. Quelque chose comme ceci:
Logger.getRootLogger().addAppender(yourTextAreaAppender);
EDIT: Pour ne connecter le niveau INFO faire:
yourTextAreaAppender.addFilter(new Filter() {
@Override
public int decide(LoggingEvent event) {
if (event.getLevel().equals(Level.INFO)) {
return ACCEPT;
} else {
return DENY;
}
}
});
1
Eh bien, ce pourrait être assez simple,
Spécifiez la propriété dans log4j.property fichier, dans mon cas, il est:
log4j.rootLogger=S log4j.appender.S=com.ibm.nzna.projects.qit.gui.StatusMessageAppender log4j.appender.S.layout=org.apache.log4j.PatternLayout log4j.appender.S.layout.ConversionPattern=%m
Ecrire est nouvelle classe avec le code suivant:
import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.spi.LoggingEvent; /** * @author Ashish Tyagi * */ public class StatusMessageAppender extends AppenderSkeleton { private StatusBar statusBar = AppDefaultWin.getStatusBar(); protected void append(LoggingEvent event) { if(event.getLevel().equals(Level.INFO)){ //here set the text of your swing component; //in my case it is: statusBar.st_STATUS.setText(event.getMessage().toString()); } } public void close() { } public boolean requiresLayout() { return false; } }
J'ai fait une myTextAppender de classe Prolonge AppenderSkeleton {zone JTextArea; // getters et setters de textarea}. Quand le gui s'initialise, je fais le myTextAppender a = new myTextAppender(); a.setArea (this.getTextArea()); Logger.getRootLogger(). addAppender (a); mais je reçois log4j: ERROR Impossible de trouver la valeur de la clé log4j.appender.WINDOW dans le log4j. Qu'est-ce que je fais mal? – Cratylus
@Russ: J'ai supprimé le fichier de configuration log4J et cela fonctionne. Est-il possible d'ajouter uniquement les messages de journalisation d'INFO et non d'AVERTISSEMENT? – Cratylus
Oui cela devrait fonctionner: yourTextAreaAppender.setThreshold (Level.INFO); –