2009-12-15 5 views
36

Ich möchte einen Appender beim Start konfigurieren und dann dynamisch bei verschiedenen Loggern hinzufügen und entfernen. Ich würde es vorziehen, dass log4j diesen Appender selbst konfiguriert und sich bei Bedarf einen Verweis darauf holt. Wenn das nicht möglich ist, muss ich den Appender selbst instanziieren und festhalten.Wie kann ich zur Laufzeit auf die konfigurierten Log4J Appender zugreifen?

+0

Ich möchte genau das gleiche tun. Ich möchte Appender in log4j.properties konfigurieren und dann einige auswählen und zur Laufzeit dynamisch zum rootLogger hinzufügen. – Joel

Antwort

3

Die Logger Klasse Methoden getAllAppenders(), getAppender(), addAppender() und removeAppender() Methoden, geerbt von Category der Klasse. Die Category-Klasse ist jedoch veraltet, und obendrein habe ich noch nie versucht, dies zu tun, aber dies könnte ein nützlicher Ausgangspunkt sein.

+2

'Kategorie' wurde von' Logger' Klasse ersetzt. 'Logger' erbt nur von' Kategorie'. Also, wenn 'Methode' Methode selbst nicht veraltet ist, ist es völlig in Ordnung zu verwenden. –

+1

Geht die Verwendung von getAppender() oder getAllAppenders() nicht davon aus, dass der Appender bereits auf dem Logger ist? Ich möchte den Appender beim Start konfigurieren, aber nicht beim Start an irgendwelche Kategorien anhängen. Nur zur Laufzeit würde ich es greifen, um addAppender() auf einem Logger aufzurufen. –

+0

Sie können einen Appender bei Bedarf erstellen und hinzufügen. –

23

Appender werden normalerweise zum Root-Logger hinzugefügt. Hier einige Pseudo-Code

// get the root logger and remove the appender we want 
Logger logger = Logger.getRootLogger(); 
Appender appender = logger.getAppender("foo"); 
logger.removeAppender(appender) 

// when we want to add it back... 
logger.addAppender(appender); 

Ich bin mir ziemlich sicher, dass Sie diese auf andere Logger als die Wurzel Logger auch tun können, obwohl ich nie versucht.

+8

Richtig, ich weiß, dass ich einen Appender von einem Logger abrufen kann, wenn er bereits so konfiguriert wurde, dass er an ihn angehängt wird. Ich suche jedoch nach einer Möglichkeit, einen beim Start konfigurierten Appender anzufassen, der * NOT * bereits an einen Logger angehängt ist. –

3

Ich möchte genau dasselbe tun. Ich möchte Appender in log4j.properties konfigurieren und dann einige auswählen und zur Laufzeit dynamisch zum rootLogger hinzufügen.

Ich kann nicht herausfinden, wie der Appen als über einen Logger andere zugreifen, an denen sie gebunden worden waren, so dass ich am Ende einen Dummy-Logger zu schaffen, und Anbringen des Appen es so konnte ich sich dynamisch abrufen. Dies ist jedoch nicht ideal, da jegliche Ressourcen, die von den Appendern verwendet werden (z. B. Dateien), im Voraus erzeugt werden, selbst wenn sie nicht verwendet werden.

+0

Ich denke, das ist wirklich die einzige Lösung. Die Appender Registry ist privat für [PropertyConfigurator] (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html) oder [DOMConfigurator] (http://logging.apache.org) /log4j/1.2/apidocs/org/apache/log4j/xml/DOMConfigurator.html). Der PropertyConfigurator löscht sogar seine Registrierung, sobald sie fertig ist. – James

0

Ich würde es auf diese Weise tun:

  1. haben Sie appender in log4j.properties angegeben, aber nicht beschränkt auf root-Logger hinzugefügt.
  2. zur Laufzeit, wenn benötigt, log4j.properties, extrahieren Sie daraus die Eigenschaften, die Sie benötigen, instanziieren Sie Ihre Appender und legen Sie ihre Optionen durch Lesen extrahierter Eigenschaften.
  3. den Appender aktivieren
  4. Logger.getRootLogger(). AddAppender (appender);
  5. Kick it off bei der Verwendung es fertig -. Logger.getRootLogger() removeAppender (..)

Nun, wenn dies Ihren eigenen appender ist, würde tun (2) leicht sein, da Sie die Bedeutung kennen die Eigenschaften und wissen was zu erwarten ist. Andernfalls würden Sie wahrscheinlich die Klasse mithilfe von Reflektion instanziieren und deren Eigenschaftensetter aufrufen (3).

0

Wenn es Appenders zur Laufzeit aktiviert/deaktiviert, die Sie tun möchten, dann fand ich eine andere Lösung (wenn auch nicht sehr elegant). Mit der log4j-Konfiguration fügen Sie alle Appender hinzu, die Sie normalerweise benötigen.

Während der Laufzeit, wenn Sie einen Appender "deaktivieren" möchten, fügen Sie einen Filter (org.apache.log4j.spi) hinzu, der Filter.DENY für jede Protokollnachricht zurückgibt. Auf diese Weise kommen keine Nachrichten für diesen Appender zustande. Wenn Sie den Appender zurück "aktivieren" möchten, löschen Sie einfach den Filter, den Sie oben hinzugefügt haben.

Ich habe das getestet und es funktioniert gut für uns (log4j 1.2).

Verwandte Themen