2010-11-24 53 views
1

La tâche:log4j: Liste des propriétés pour chaque Appender?

J'essaye de configurer un Appender pour produire dans un JTextArea. Je crois qu'un WriterAppender est capable d'écrire dans un OutputStream. J'ai déjà sous-classé OutputStream pour produire une classe JTextAreaOutputStream, qui est actuellement remplie en piratant la sortie de System.out et System.err.

Le fichier Configuraton:

# File appender for the GUI screen 
    log4j.appender.gui = org.apache.log4j.WriterAppender 
    log4j.appender.gui.Target=project.gui.GUIView.logWindow //logWindow is the name of my JTextArea 

    # Root logger option 
    log4j.rootLogger=INFO, gui 

L'erreur:

log4j:WARN No such property [target] in org.apache.log4j.WriterAppender. 

La question:

Quelqu'un sait où je peux identifier l'ensemble valide de propriétés par Appender?

Répondre

2

Pourquoi pensez-vous que WriterAppender a une telle propriété? Pour autant que je peux voir de JavaDocs, il n'a pas une telle propriété. Peut-être que vous confondez avec ConsoleAppender?

Vous pouvez obtenir une liste de propriétés par appender si vous ouvrez le code JavaDoc/source approprié et recherchez toutes les méthodes de définition JavaBean. Cela signifie que si WriterAppender aurait target propriété, il aurait besoin d'avoir setTarget(...) méthode setter.

Quoi qu'il en soit, je vous recommande de sous-classe WriterAppender et créer votre propre JTextAreaAppender qui passerait dans votre coutume OutputStream à superclasse. Voir ConsoleAppender et FileAppender pour des échantillons de telles sous-classes.

EDIT: en passant, comme vous le plus probablement besoin de passer dans une référence à JTextArea à votre JTextAreaAppender, je vous recommande de configurer log4j programme. Ou au moins ajouter votre appender personnalisé par programme, après avoir fait référence au JTextArea.

Ou, mieux encore, vous pouvez le configurer via le fichier de propriétés mais laissez le zéro de référence JTextArea initiale - après votre application a commencé et vous avez votre référence jTextArea, vous pouvez regarder programme cuvette tous les appenders log4j et passer dans la référence à votre code personnalisé JTextAreaAppender.

+0

C'est mon point Neeme. J'ai complètement deviné le nom de la propriété en la volant à un autre type d'Appender et en croisant mes doigts. Le JavaDoc n'apparaît que pour couvrir les noms de méthodes plutôt que les propriétés qui peuvent être définies? – Ben

+0

Il n'y a rien de magique dans ces propriétés - elles sont toutes visibles dans JavaDocs, sous la forme de "méthodes setter" JavaBean. WriterAppender n'a pas de propriété "target" car WriterAppender n'a pas de méthode "setTarget (String)" correspondante. –

+0

Cela répond-il à votre question? Si oui, alors acceptez ma réponse ;-) http://stackoverflow.com/faq#howtoask –

0

Je sais que c'est assez vieux, mais je voulais juste faire un suivi sur cette question car je viens de passer toute la matinée à essayer de trouver la même information. D'après ce que je peux dire, le log4j WriterAppender ne peut pas être configuré dans un fichier de configuration externe, car il n'a pas d'options configurables. La classe est conçue pour écrire dans un Writer ou OutputStream et il n'existe aucun moyen de spécifier cet objet dans le fichier de configuration basé sur une chaîne.

Si cela est incorrect s'il vous plaît me corriger et me pointer vers l'endroit où se trouve les informations correctes. Je suis un peu surpris que cette réponse ne soit pas plus facilement et évidemment trouvée telle qu'elle est.

2

Voilà comment j'ai configuré WriterAppender:

En log4j.properties:

log4j.rootLogger=INFO, ConsoleAppenderInstance,FileAppenderInstance, WriterAppenderInstance 
... 
log4j.appender.WriterAppenderInstance=org.apache.log4j.WriterAppender 
log4j.appender.WriterAppenderInstance.layout=org.apache.log4j.PatternLayout 
log4j.appender.WriterAppenderInstance.layout.ConversionPattern=%m%n 

Dans le code java:

StringWriter writer = new StringWriter(); 
Logger root = Logger.getRootLogger(); 
WriterAppender app = (WriterAppender)root.getAppender("WriterAppenderInstance"); 
app.setWriter(writer); 
... 
writer.toString() 

Et comme pour les propriétés disponibles, je suppose que tout démarrage avec set ici: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/WriterAppender.html (et dans les sous-classes)