webentwicklung-frage-antwort-db.com.de

Wie kann ich zur Laufzeit auf die konfigurierten Log4J-Appender zugreifen?

Ich möchte einen Appender beim Start konfigurieren und ihn dann bei Bedarf dynamisch hinzufügen und von verschiedenen Loggern entfernen. Ich würde es vorziehen, log4j diesen Appender selbst konfigurieren zu lassen und bei Bedarf einfach einen Verweis darauf zu nehmen. Wenn das nicht möglich ist, muss ich den Appender selbst instanziieren und festhalten.

38
Seth Weiner

Appender werden im Allgemeinen zum Root-Logger hinzugefügt. Hier ist ein Pseudocode

// 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 dies auch mit anderen Loggern als dem Root-Logger machen können, obwohl ich das noch nie probiert habe.

24
Alan Krueger

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.

Ich konnte nicht herausfinden, wie ich auf die Appender zugreifen kann, außer über einen Logger, an den sie angehängt wurden. Deshalb habe ich einen Dummy-Logger erstellt und die Appender damit verbunden, sodass ich sie dynamisch abrufen konnte. Dies ist jedoch nicht ideal, da Ressourcen, die von den Appendern verwendet werden (z. B. Dateien), selbst dann erstellt werden, wenn sie nicht verwendet werden.

3
Joel

Die Klasse Logger hat Methoden für getAllAppenders () , getAppender () , addAppender () und removeAppender () - Methoden, die von der Category geerbt werden Klasse. Die Category-Klasse ist jedoch veraltet. Außerdem habe ich noch nie versucht, dies zu tun. Dies könnte jedoch ein nützlicher Ausgangspunkt sein.

3
Thomas Owens

Wenn Appender zur Laufzeit aktiviert/deaktiviert werden soll, habe ich eine andere Lösung gefunden (wenn auch nicht sehr elegant). Fügen Sie mithilfe der log4j-Konfiguration alle Appender hinzu, die Sie normalerweise benötigen.

Fügen Sie zur Laufzeit, wenn Sie einen Appender "deaktivieren" möchten, einen Filter (org.Apache.log4j.spi) hinzu, der für jede Protokollnachricht Filter.DENY zurückgibt. Auf diese Weise kommen keine Nachrichten für diesen Appender durch. Wenn Sie den Appender wieder "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).

0
nLogN

Ich würde es so machen:

  1. haben Sie den appender in log4j.properties angegeben, jedoch nicht zum Root-Logger hinzugefügt.
  2. zur Laufzeit greifen Sie bei Bedarf zu, log4j.properties zu extrahieren, daraus die gewünschten Eigenschaften zu extrahieren, Ihren Appender zu instanziieren und seine Optionen durch Lesen extrahierter Eigenschaften festzulegen. 
  3. aktivieren Sie den Appender
  4. Logger.getRootLogger (). AddAppender (Appender);
  5. Wenn Sie damit fertig sind, können Sie es loslegen - Logger.getRootLogger (). RemoveAppender (..)

Wenn dies nun Ihr eigener Appender ist, ist das Ausführen von (2) einfach, da Sie die Bedeutung der Eigenschaften kennen und wissen, was zu erwarten ist. Andernfalls möchten Sie wahrscheinlich die Reflektion verwenden, um die Klasse zu instanziieren und ihre Eigenschaftssetzer aufzurufen, bevor Sie (3) ausführen.

0
Dima