[JAVA] Verhindern von Fehlern im Logger-Namen durch Kopieren

Überblick

Dies sind die Tipps zum Erstellen einer Logger-Instanz, die auch in den häufig gestellten Fragen zu SLF4J beschrieben werden. Hier ist eine Geschichte und eine Lösung für Loggers Erklärung.

[Problem] Falscher Logger-Name

Ein häufiger Fehler bei Logger ist ein Fehler im Logger-Namen. Dies ist in der Regel der Fall, wenn Sie die Logger-Deklaration aus einer anderen Quelle kopieren.

Beispiel für die Angabe des falschen Logger-Namens


public class MyClass {
  private static final Logger LOGGER = LoggerFactory.getLogger(User.class); //Fehler!Kopieren Sie weiter aus dem Code der Benutzerklasse
  //...
}

[Lösung] Verwenden Sie Method Handle

Mit MethodHandle [^ mh] aus Java7 können Sie das aufrufende Class-Objekt statisch abrufen. (Verwenden Sie die statische Methode [^ mhs] der MethodHandles-Klasse (Rückgabemethode [^ mhs-lookup]) ← Beachten Sie, dass es sich nicht um die MethodHandle-Klasse [^ mh] handelt.)

Klassenobjekt abrufen


Class<?> clazz = MethodHandles.lookup().lookupClass();

Die Redewendung der Logger-Generierung, die dies verwendet, ist in den SLF4J-FAQ [^ slf4j] angegeben. In diesem Fall können Sie es kopieren und unverändert verwenden (ohne den Logger-Namen des Arguments neu zu schreiben).

Logger-Generierungssprache


import java.lang.invoke.MethodHandles;
      
public class MyClass {
  private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
  //...
}

Für Ihre eigene Logger-Klasse

Wenn Sie über eine eigene Logger-Klasse verfügen, können Sie verhindern, dass der falsche Logger-Name angegeben wird, indem Sie die Argumenttypen der Factory-Methode wie unten gezeigt einschränken. Ich habe früher über meine eigene Logger-Klasse geschrieben. → Verwenden Sie LocationAwareLogger für Ihren eigenen Logger

Factory-Methodenargument MethodHandles.Nur nachschlagen


import java.lang.invoke.MethodHandles;

public class MyLocationAwareLogger {
  // (Auslassen von Teilen, die nichts mit diesem Thema zu tun haben)

  //Der Konstruktor ist privat
  private MyLocationAwareLogger(org.slf4j.spi.LocationAwareLogger logger) {
    this.logger = logger;
  }

  //Fabrikmethode(Nur diese Methode ist verfügbar)
  public static MyLocationAwareLogger getLogger(MethodHandles.Lookup lookup) {
    return getLogger(lookup.lookupClass());
  }

  //Andere als die oben genannten Factory-Methoden sind privat
  private static MyLocationAwareLogger getLogger(Class<?> clazz) {
    org.slf4j.spi.LocationAwareLogger logger = (org.slf4j.spi.LocationAwareLogger) LoggerFactory.getLogger(clazz);
    return new MyLocationAwareLogger(logger);
  }

  // (Auslassen von Teilen, die nichts mit diesem Thema zu tun haben)
}

Logger-Generierung


private static final MyLocationAwareLogger LOGGER = MyLocationAwareLogger.getLogger(java.lang.invoke.MethodHandles.lookup());
//Das Folgende führt zu einem Kompilierungsfehler
// private static final MyLocationAwareLogger LOGGER_NG1 = MyLocationAwareLogger.getLogger(User.class);
// private static final MyLocationAwareLogger LOGGER_NG2 = MyLocationAwareLogger.getLogger("User");

schließlich

Obwohl es sich nur um einen Logger-Namen handelt, hat die Angabe eines falschen Werts enorme nachteilige Auswirkungen auf die Fehleruntersuchung. Ich denke, es gibt viele Leute, die sich vom Namen Logger täuschen lassen und in die endlose Untersuchung von Teilen geraten sind, die nichts mit dem Fehler zu tun haben. Es ist ein einfacher Tipp, also versuchen Sie es bitte.

Recommended Posts

Verhindern von Fehlern im Logger-Namen durch Kopieren
Ich habe den Paketnamen überprüft, auf den die in der JAR-Datei enthaltene Klasse verweist
Nach mehreren Feldern in der Klasse sortieren
Benennen und rufen Sie in Ruby übergeordnete Klassenmethoden explizit auf
Wenn Sie sich im Klassennamen verlieren
Passen Sie den durch Spring Component-Scan festgelegten Bean-Namen an
[Java] Beurteilung durch Eingabe von Zeichen in das Terminal
Format der Protokollausgabe von Tomcat selbst in Tomcat 8
[Kotlin] Ermittelt den Argumentnamen des Konstruktors durch Reflektion
Lesen Sie die Paketerfassung, die von tcpdump mit Java erhalten wurde
Holen Sie sich den Anime-Namen für diesen Begriff durch Scraping
Rufen Sie den Namen des Testfalls in der JUnit-Testklasse ab
Fügen Sie den von Doma generierten Quellcode in die Quell-JAR ein