2016-04-11 14 views
2

Ich habe einen benutzerdefinierten Wrapper um Log4j2. und ich habe ein paar Probleme bei der Ausgabe, unter der XXX-Zeile ist was ich will. aber wenn ich "Log.info()" benutze, kann ich nicht dasselbe Ergebnis bekommen. jede Abhilfe außer "Log .getLog(). info()" hierbenutzerdefinierte Log4j2 Wrapper und Ausgabe

output result

ist Code

public class TestMyLog { 
public static void main(String[] args){ 
    Log.info("asdasggg"); 
    Log.debug("asdasda"); 
    Log.fatal("asdwefe"); 
    Log.error("fgggg"); 
    Log.warn("sdsdee"); 
    Log.trace("ioimom"); 
    System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); 
    Log.getLog().info("sdss"); 
    Log.getLog().debug("dddddd"); 
    Log.getLog().error("erffs"); 

} 

}

public class Log{ 
public static Log4j getLog(){ 
    return new Log4j2Wrapper(); 
} 
public static void info(String str){ 
    new Log4j2Wrapper().info(str); 
} 
public static void debug(String str){ 
    new Log4j2Wrapper().debug(str); 
} 
public static void error(String str){ 
    new Log4j2Wrapper().error(str); 
} 
public static void fatal(String str){ 
    new Log4j2Wrapper().fatal(str); 
} 
public static void trace(String str){ 
    new Log4j2Wrapper().trace(str); 
} 
public static void warn(String str){ 
    new Log4j2Wrapper().warn(str); 
} 
public static boolean isInfoEnabled(){ 
    return new Log4j2Wrapper().isInfoEnabled(); 
} 
public static boolean isDebugEnabled(){ 
    return new Log4j2Wrapper().isDebugEnabled(); 
} 
public static boolean isErrorEnabled(){ 
    return new Log4j2Wrapper().isErrorEnabled(); 
} 
public static boolean isFatalEnabled(){ 
    return new Log4j2Wrapper().isFatalEnabled(); 
} 
public static boolean isWarnEnabled(){ 
    return new Log4j2Wrapper().isWarnEnabled(); 
} 
public static boolean isTraceEnabled(){ 
    return new Log4j2Wrapper().isTraceEnabled(); 
} 

}

public class Log4j2Wrapper implements Log4j{ 
private static final String FQCN = Log4j2Wrapper.class.getName(); 
private ExtendedLoggerWrapper log; 

public Log4j2Wrapper() { 
    Logger logger = LogManager.getLogger(); 
    log = new ExtendedLoggerWrapper((ExtendedLogger) logger, 
      logger.getName(), logger.getMessageFactory()); 
} 

public boolean isInfoEnabled() { 
    return log.isInfoEnabled(); 
} 
public boolean isDebugEnabled() { 
    return log.isDebugEnabled(); 
} 
public boolean isErrorEnabled() { 
    return log.isErrorEnabled(); 
} 
public boolean isFatalEnabled() { 
    return log.isFatalEnabled(); 
} 
public boolean isWarnEnabled() { 
    return log.isWarnEnabled(); 
} 
public boolean isTraceEnabled() { 
    return log.isTraceEnabled(); 
} 
public void info(String str) { 
    log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), null); 
} 
public void info(String str, Throwable t) { 
    log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), t); 
} 
public void debug(String str){ 
    log.logIfEnabled(FQCN, Level.DEBUG,null,new SimpleMessage(str),null); 
} 
public void error(String str){ 
    log.logIfEnabled(FQCN, Level.ERROR,null,new SimpleMessage(str),null); 
} 
public void fatal(String str){ 
    log.logIfEnabled(FQCN, Level.FATAL,null,new SimpleMessage(str),null); 
} 
public void trace(String str){ 
    log.logIfEnabled(FQCN, Level.TRACE,null,new SimpleMessage(str),null); 
} 
public void warn(String str){ 
    log.logIfEnabled(FQCN, Level.WARN,null,new SimpleMessage(str),null); 
} 

}

public interface Log4j { 
boolean isInfoEnabled(); 
boolean isDebugEnabled(); 
boolean isErrorEnabled(); 
boolean isFatalEnabled(); 
boolean isWarnEnabled(); 
boolean isTraceEnabled(); 
void info(String str); 
void info(String str, Throwable t); 
void debug(String str); 
void error(String str); 
void fatal(String str); 
void warn(String str); 
void trace(String str); 

}

Antwort

1

Wenn Sie eine benutzerdefinierte Logger-Wrapper schreiben wollen es schwierig wird Informationen über den Standort richtig zu machen, weil Log4j2 die Stacktrace für eine Reihe von Schritten geht diesen Ort zu finden, und Ihre Wrapper fügt ein zusätzliches StacktraceElement.

Ich empfehle Ihnen, erstellen Sie Ihre benutzerdefinierte Wrapper mit einem Log4j2-Tool: Werfen Sie einen Blick auf die manual page for custom log levels. Dieses Tool kann Code für eine benutzerdefinierte Protokollfunktion generieren, die Positionsinformationen korrekt verarbeitet.

P.S. Beachten Sie, dass das Durchlaufen des Stacktrace zum Auffinden des Protokollierungsorts in Bezug auf die Leistung sehr teuer ist. Die async logging page hat einige konkrete Zahlen. Es ist wie eine Ausnahme mit jeder Log-Nachricht zu werfen.

+0

danke, aber mein Zweck ist, Log.xxx direkt zu verwenden, ohne ein Logger-Objekt zu deklarieren. – Ives

+0

Ich schlage vor, Sie verwenden das Tool, um den Wrapper zu generieren, schauen, wie es das Standortproblem (fgcn) löst und das in Ihrer Log-Klasse verwenden. –