Vorteile von Log4j singleton-wrapper?
Ich habe vor kurzem geerbt einige Java-code und integrieren müssen, es in ein Projekt, dass ich auf Arbeit bin. Mein Projekt ist ein service-agent, Prozesse und Transformationen von XML-Nachrichten. Während Sie durch den neuen code, entdeckte ich die folgenden logging-Klasse:
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class MyLogger {
private static MyLogger instance = null;
protected final static Logger log = Logger.getLogger(MyLogger.class);
private MyLogger() {
super();
}
public static MyLogger getInstance(){
if(instance == null){
instance = new MyLogger();
BasicConfigurator.configure();
log.setLevel(Level.ALL);
}
return instance;
}
public void info(String myclass, String msg) {
log.info("[" + myclass + "] " + msg);
}
public void error(String myclass, String msg, Exception ce) {
log.error("[" + myclass + "] " + msg, ce);
}
public void warning(String myclass, String msg) {
log.warn("[" + myclass + "] " + msg);
}
}
Dieser Klasse im Grunde umschließt log4j mit (anderen) singleton. Alle von der Abholzung in den Klassen, die ich brauche, um zu integrieren in etwa so Aussehen:
public class MyClass {
private final static MyLogger log = MyLogger.getInstance();
private final static String myclass = MyClass.class.getName();
...
log.info(myclass, "Information message...");
}
Sehe ich nicht ein offensichtlicher Vorteil der Verwendung eines extra-Klasse für die Protokollierung, so dass ich überlege, refactoring, diesen code zu entfernen, die Klasse MyLogger und melden Sie sich in der folgenden Weise:
import org.apache.log4j.Logger;
public class MyClass {
private static Logger log = Logger.getLogger(MyClass.class);
...
log.info("Information Message...");
}
Dies würde die logging-Mechanismus konsistent über das Projekt. Bevor ich das Tue, würde ich gerne wissen, ob es irgendwelche Vorteile einwickeln Log4j mit einer singleton-Klasse, die ich möglicherweise fehlen. Danke!
EDIT: Danke an alle für die hilfreichen Antworten - ich Abholung, mehrere neue Erkenntnisse von jedem. Angenommen, Nathan Hughes' Antwort für den Hinweis auf verlorene Funktion durch verlassen der Klasse intakt - ich hatte angenommen, dass der größte Nachteil das verlassen des singleton allein war einfach code aufblähen. Ich trash der Klasse.
- Was logging-backend im Projekt verwendet wird?
- Wie es scheint, der Autor dieses nutzen wollte, log4j, ohne die Vorteile des log4j ' s features
- wenn Sie Lesen Sie den code
org.apache.log4j.Logger
. - wir sind derzeit mit SyslogAppenders senden alle log-Dateien auf einem zentralen server.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Loswerden. Mit dieser Monstrosität bedeutet, dass alle, die Protokollierung, die durch geht, wird es aufgeführt werden, mit den gleichen logger (MyLogger) und Methode (das ist der Grund, warum die Argumente, die zu seinen Methoden gehören der Klasse der das Ding angemeldet ist). Das bedeutet, dass nicht nur haben Sie, um jede Klasse, Methode und Zeilennummer Informationen zu jedem logger-Aufruf, aber Sie können nicht filtern log-Stufen für die verschiedenen Pakete die Möglichkeit, Sie könnte mit den typischen log4j Ansatz mit Klassen, die als Holzfäller.
Dieses Ding ist ein Stück Müll, und Sie werden besser dran ohne Sie.
Der einzige Vorteil, dass ich sehen konnte, ist, dass es leicht sein würde, zu tauschen die log4j-Implementierung mit einem anderen logging-Implementierung, oder Holen Sie sich die Anmeldung etwas zu tun, viel mehr individuelle wie melden Sie sich zu einem Ihrer eigenen Datenbanken.
Sagte, ich würde noch refaktorieren den code zu verwenden log4j direkt. Oder, wahrscheinlicher, in meinem Fall, zu verwenden SLF4J.
Einer Sache, die Ihr geerbt code ist, dass log4j tut, ist machen, was nicht thread-sicher. Da es keine Verriegelung in
getInstance()
Sie können möglicherweise die hand aus, mehr als eine Instanz und brechen die singleton-Absichten der code.Verlieren Sie auch die Fähigkeit, legen Sie den Protokolliergrad für jede Klasse, je nachdem, was Sie tun.
Der einzige Fehler, die ich sagen kann, ist, weil diese Erklärung:
Der logger ist im Grunde süchtig nach Objekt
MyLogger
und alle logging-Informationen/Fehler/Warnungen, etc. wird "verknüpft", umMyLogger
. Sie haben keine Ahnung, welches Objekt Hinzugefügt, die Protokollierung von Informationen, nicht die geringste.Der einzige Vorteil sehe ich mit diesem Singleton, ist:
static final Logger
Umsetzung all der Zeit.Habe ich gesehen das in meinem Unternehmen so gut, aber ich weiß nicht empfehlen diese Art von setup. Lieber SLF4J oder der Java-Logging-Framework.