2016-04-11 57 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

ありがとうございますが、私の目的はLoggerオブジェクトを宣言せずにLog.xxxを直接使用することです。 – Ives

+0

私は、ツールを使用してラッパーを生成し、ロケーションの問題(fgcn)をどのように解決しているかを見て、それをLogクラスで使用することをお勧めします。 –

関連する問題