2010-10-12 15 views
5

Ich habe zwei Klassen in meinem Projekt, die ich den Logger von der Hauptklasse an die Unterklasse weitergeben möchte und die Unterklasse die Loggereinstellungen der Eltern verwenden.Übergabe eines Loggers zwischen Klassen

Die Unterklasse ist eine separate, generische Klasse (d. H. Nicht an die Hauptklasse gebunden) und muss in der Lage sein, einen eigenen Protokollierer zu erstellen, wenn nicht einer bereitgestellt wird.

Die Hauptklasse erstellt einen Protokollierer, fügt einen Konsolenhandler, einen Dateihandler und einen Protokollformatierer hinzu und möchte, dass die Unterklasse das Protokollformatierer für seine Protokollnachrichten und dann, wenn die Hauptklasse fortgesetzt wird, vorübergehend überschreiben kann , gehe zum Log-Formatierer zurück.

Ich habe versucht, den Logger zu der Unterklasse zu bringen, oder einen neuen zu erstellen, falls erforderlich, aber ich bekomme mehrere Meldungen auf dem Bildschirm und in der Protokolldatei (es scheint die Handler an die Hauptklasse anzuhängen anstatt es zu übersteuern).

Wie würde ich das machen?

Antwort

10

Ich nehme an, Sie verwenden java.util.logging-Paket. In diesem Fall erhalten Sie immer und überall, wo Sie Logger.getLogger (someString) verwenden, dieselbe Logger-Instanz.

Zum Beispiel: Wenn in der Hauptklasse Logger Log = Logger.getLogger ("myLogger"); , Sie können den gleichen Logger in jeder anderen Klasse bekommen, indem Sie Logger.getLogger ("myLogger") verwenden;

+0

So brauche ich nicht den Logger übergeben und die Logger-Instanz festgelegt? z.B. privater void setLogger (Logger Logger) { this.logger = Logger; } – Omertron

+0

Ok, also habe ich das getan, änderte die Methode, um den String-Namen des Loggers zu akzeptieren. Jetzt muss ich den logFormatter der Hauptklasse in den Formatierer meiner lokalen Klasse umleiten, aber das Formatierer der Hauptklasse "überschreibt" jetzt – Omertron

+0

Nun, Sie könnten den ursprünglichen (Haupt) Logger Formatierer "speichern", zum Beispiel als Unterklasse Feld, und setze es zurück, wenn du es in der Unterklasse verwendest. Ich würde sagen, es ist sicher genug, wenn es keine Parallelität gibt. Es wird jedoch empfohlen, dass alle Klassen ihren eigenen Logger verwenden und ihre eigenen Instanzen mithilfe von Logger.getLogger (LocalClass.class.getName()) abrufen. – cbaby

0

Dies ist, was ich bisher:

public void setLogger(String loggerName) { 
    MySubClass.logger = Logger.getLogger(loggerName); 

    for (Handler handler : logger.getHandlers()) { 
     handler.setFormatter(tmdbFormatter); 
    } 
    logger.setUseParentHandlers(true); 
    logger.setLevel(Level.ALL); 
} 
Verwandte Themen