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.
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
//...
}
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());
//...
}
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");
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