2 Stimmen

Log(ger) Variable Deklaration

In der Mehrzahl der Fälle sehe ich Log Instanzen wie folgt erklärt:

public static final Log LOG = LogFactory.getLog(MyClass.class);

Ich nehme an, dass dies bedeutet, dass die Log-Konfiguration wird geladen, wenn die MyClass geladen und ist damit festgeschrieben, bis die MyClass entweder neu geladen oder die JVM neu gestartet wird?

Wenn diese Annahme also richtig ist, wie kann man am besten sicherstellen, dass Änderungen an der Log-Konfiguration aufgegriffen werden, sobald (oder kurz nachdem) sie geschehen?

3voto

oxbow_lakes Punkte 131223

Ich gehe davon aus, dass Sie Folgendes verwenden commons-logging von der LogFactory Klasse? Soweit ich weiß, ist keine der üblichen Logging-Implementierungen (Log4J, java.util.logging ) können Sie eine Konfigurationsdatei in einer laufenden Anwendung neu laden (unabhängig davon, ob die aktuelle Logger s werden deklariert als static Variablen). ( EDIT : Die folgende Antwort von Peter beweist, dass ich im Fall von Log4J falsch lag )

Sie ermöglichen jedoch die dynamischer Wechsel der Protokollierungsebenen (z.B. über eine MBean ). Diese Pegeländerungen werden aufgegriffen von jede Logger (einschließlich solcher, die als statische Variablen deklariert sind). Wenn Sie java.util.logging erhalten Sie die MBean kostenlos in der JConsole .

Geht es Ihnen nur um die Änderung der Ebenen, oder möchten Sie völlig unterschiedliche Protokollierungskonfigurationen bereitstellen (z. B. Dateien, Logger-Definitionen)? spontan ?

2voto

omerkudat Punkte 8893

Ich denke, dies hängt von der zugrunde liegenden Implementierung ab, wie von oxbow_lanes dargelegt. Im Allgemeinen könnte es schwierig sein, Ihr Logging-Subsystem neu zu konfigurieren, wenn Sie sich auf Konfigurationsdateien verlassen, die über den Klassenpfad verfügbar sind. Um diese Einschränkung zu umgehen, führen wir unsere gesamte Konfiguration programmatisch durch und verlassen uns nicht nur auf statische Konfigurationsdateien. Aber ich weiß nicht, ob Ihre Implementierung die programmatische Rekonfiguration unterstützt.

2voto

Vinay Sajip Punkte 89444

Nein, die Protokollkonfiguration wird normalerweise geladen, wenn die Protokollimplementierungsklassen initialisiert werden. Wenn Ihre Klasse (erneut) geladen wird, wird lediglich die Logging-API aufgerufen, um einen Logger zu erhalten (der in jeder Konfiguration vorhanden sein kann oder auch nicht) und als Klassenvariable gespeichert.

Um Ihre Protokollierungskonfiguration neu zu laden, müssen Sie normalerweise die Protokollierungsimplementierung dazu bringen, neu zu laden.

2voto

Das hängt vom Backend ab.

Logback hat eine sehr raffinierte Funktion, bei der das Nachladen durch JMX ausgelöst werden kann, z.B. in jvisualvm oder jconsole.

1voto

Stephen C Punkte 665668

Wenn Sie die "java.util.logging"-Protokollierung direkt verwenden, KÖNNEN Sie die Logger-Konfigurationen im laufenden Betrieb neu laden. Es gibt zwei Methoden in der LogManager-Klasse, die dies ermöglichen:

public void readConfiguration() 
    throws IOException, SecurityException

Dadurch werden die Standardprotokolleigenschaften neu geladen und die Protokollierungskonfiguration neu initialisiert.

public void readConfiguration(InputStream ins)
    throws IOException, SecurityException

Damit werden die Protokollierungseigenschaften aus einem Stream (im Property-Dateiformat) geladen und die Protokollierungskonfiguration neu initialisiert.

Siehe die LogManager javadoc .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X