2016-04-11 91 views
2

我有一個自定義包裝Log4j2周圍。而我在輸出方面有一些問題,在XXX線下是我想要的。但是當我使用「Log.info()」我不能得到相同的結果。除了任何解決辦法 「日誌.getLog()。信息()」自定義Log4j2包裝和輸出

output result

這裏是代碼

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); 

}

回答

1

如果你想編寫一個自定義記錄器包裝器就變得棘手的位置信息正確的,因爲Log4j2走棧跟蹤了若干步驟,找到位置,和您的包裝增加了一個額外的StacktraceElement。

我建議你使用Log4j2工具創建自定義包裝:看看manual page for custom log levels。此工具可以爲正確處理位置信息的自定義記錄器生成代碼。

P.S. 請注意,在性能方面,步行堆棧跟蹤以查找日誌記錄位置非常昂貴。 async logging page有一些具體的數字。這就像每個日誌消息拋出一個異常。

+0

謝謝,但我的目的是直接使用Log.xxx而無需聲明一個記錄器對象。 – Ives

+0

我建議你使用這個工具來生成包裝,看看它如何解決位置問題(fgcn)並在你的Log類中使用它。 –