0

私はこのようなものを使いたくない:

Logger.getLogger(MyClass.class).info("Info message");

何かを記録したいたびに。

私は次のようなメソッドを持つロギングサービスを実装しようとしました:

public void info(final Object aMessage, final Object aSender);

これにより、送信者のクラスに基づいてLoggerインスタンスを取得できますが、ログソースクラスのメソッドと行が非表示になります。

私はAOPやSlf4jのような代替案について知っています。最初のものは私が望んでいるものではなく、2番目のものはコードの最初の行に似たものを紹介します:

LoggerFactory.getLogger(HelloWorld.class).info("Info message");

したがって、私の懸念はLog4jの依存関係を隠すことではなく、次のようにアプリケーション全体でロギング呼び出しを統合することです。

//loggingController instance was injected previously
loggingControler.info("Info message",this);

これを実装する方法はありますか?

4

1 に答える 1

0

わかりました。問題を解決する方法は少なくとも1つあるようです。

たとえば、LoggingServiceとLoggingControllerがあります。1つ目はLog4jと直接連携し、2つ目はサービスとアプリケーション全体の間の単なるレイヤーです。

public class LoggingService implements ILoggingService{

   //other methods here.

   @Override
   public void warn(final Object aMessage, final Object aSender, final Throwable aThrowable) {
       log(aMessage, aSender, Level.WARN, aThrowable);
   }


   private void log(final Object aMessage, final Object aSender, final Level aLevel, final Throwable aThrowable) {
       final String className = getClassNameBy(aSender);
       Logger.getLogger(className).log(className, aLevel, aMessage, aThrowable);
   }
}

public class LoggingController implement ILoggingController{
    //logging service is injected previously
    @Override
    public void warn(final Object aMessage, final Throwable aThrowable) {
        loggingService.warn(aMessage, this, aThrowable);
    }
}

したがって、この場合、ユーザーが次を使用して何かをログに記録できるようにします。

loggingController.warn("A warning", null);

この方法の使用:

  1. ユーザーは、基盤となるロギング機能について何も知りません
  2. ダミーのロガーが必要ない場合、または環境で許可されていない場合は、いつでもダミーのロガーを提供することができます。
  3. ロギング機能は、アプリケーション全体で統合されています
  4. クラス名とコード行がログに正しく表示されます。
  5. Log4jの最も便利な機能の1つであるパッケージ/クラス名によるフィルタリングは使用できません。
于 2012-08-15T12:38:46.100 に答える