2016-02-24 1 views
7

Ich habe versucht, die folgenden LoggernJava Logging-Framework, die LOGGER Erklärung auf jeder Klasse

  • Java Logging API
  • Log4j
  • slf4j

All dies erfordert nicht erfordert eine LOGGER Erklärung auf Klassenebene, wie die unter

private final static java.util.logging.Logger.Logger LOGGER = java.util.logging.Logger.Logger.getLogger(MyClass.class.getName()); 
private final Logger slf4jLogger = LoggerFactory.getLogger(SLF4JHello.class); 
private final static Logger log4jLogger = Logger.getLogger(Log4jHello.class); 

Das sieht scheußlich aus, gibt es ein Logger-Framework in Java, das diese Deklaration nicht benötigt?

Was ich suche, kann ich eine globale Erklärung haben wie

private final static Logger Logger = Logger.getLogger(MyApp.class); 

Aber wenn ich Logger.log (..) von Klasse XXX.class rufen dann sollte der Logger Gebrauch machen des XXX.Klassennamens.

+2

Es liegt ganz bei Ihnen (in jedem dieser Frameworks), wie Sie Ihre Logger definieren und benennen. Sie können nur einen für Ihre gesamte Anwendung haben, oder 'getLogger' bei jedem Anruf anrufen. – Thilo

+0

Related: http://StackOverflow.com/Questions/26600757/Standard-way-to-Implement-a-Logger-Across-Classes-In-Java?RQ=1 http://StackOverflow.com/Questions/27038694/ is-da-ein-leicht-zu-erstellen-eine-Logger-Instanz für jede Klasse? rq = 1 – Thilo

+0

@Thilo mit einem für die gesamte Anwendung wird alle Protokolle mit dem gleichen Namen machen. Was ich nicht suche. Stattdessen muss das Framework den Klassennamen des Aufrufers anzeigen. – Edi

Antwort

2

Ihr Problem ist mehr als wahrscheinlich nicht mit dem Logging-Framework, sondern mit dem Layout.

Konkretes Beispiel

so35592962/App.java

package so35592962; 
import org.apache.logging.log4j.*; 
import so35592962.sub.OtherClass; 
public class App { 
    public static final Logger logger = LogManager.getLogger(); 
    public static void main(String[] args) { 
    logger.error("in App.main"); 
    OtherClass.act(); 
    } 
} 

so35592962/sub/OtherClass.java

package so35592962.sub; 
import static so35592962.App.logger; 

public class OtherClass { 
    public static void act() { 
    logger.error("OtherClass.act"); 
    } 
} 

So können Sie sehen, das ist völlig ist, was Sie wollen: Klassen, die einen einzelnen Logger zu verwenden. Also guter Punkt, Log4J2 kann dafür verwendet werden.

Nun füge ich die magische Datei log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n"/> 
    </Console> 
    </Appenders> 
    <Loggers> 
    <Root level="error"> 
     <AppenderRef ref="Console"/> 
    </Root> 
    </Loggers> 
</Configuration> 

Ausführen dieser Druck wird:

12:05:28.834 [main] ERROR so35592962.App - in App.main 
12:05:28.836 [main] ERROR so35592962.sub.OtherClass - OtherClass.act 

Schauen Sie, es gibt verschiedene Klassennamen hier! Aber ich habe Log4J2 benutzt.

Was ist hier passiert?

Hinweis das Muster in der PatternLayout Tag verwendet:

%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n

Die Standard-Beispiele und was Sie in der Regel über das Internet sehen alle nutzen die %L Muster. Dieses Muster zeigt den Loggernamen an. Aber du hast gesagt, du willst es nicht. Glücklicherweise existieren andere Muster. %C zeigt den Klassennamen anstelle des Protokollierernamens an. Dies ist das Muster, das hier verwendet wird.

Nach the PatternLayout documentation, das %C Muster macht folgende:

Ausgänge der vollständig qualifizierten Klassennamen des Anrufers Ausgabe die Protokollierungs Anfrage.

Wichtiger Hinweis, auch in der Dokumentation erwähnt:

Generieren der Klassenname des Anrufers (Ortsinformation) ist eine teure Operation und kann die Leistung auswirken. Verwenden Sie mit Vorsicht.

+0

Wenn Sie jedoch nur einen einzelnen Logger haben, können Sie verschiedenen Loggern keine unterschiedlichen Log-Level (oder andere Formatierer oder unterschiedliche Appender) zuweisen. – Thilo

+0

Richtig, aber das beantwortet die erste Frage, glaube ich. Ein eindeutiger Logger, der den Klassennamen verwendet. –

+2

Auch diese Antwort ist kein "Ja, auf alle Fälle, mach das", sondern eine "deine Anfrage kann gemacht werden, hier ist wie". Ich persönlich unterstütze das nicht, aber wenn ich für das OP arbeite, bin ich froh, dass ich geholfen habe! –