72

私はプロジェクトに取り組んでおり、現在、log4j を使用したログの実装に取り​​組んでおり、ログの実装方法に興味がありました。私が試している 2 つの実装は次のとおりです。

最初のオプション

そのクラスとすべてのサブクラスのスーパー クラスから単一のログを使用します。

public abstract class AbstractFoo {
    protected static Log LOG = LogFactory.getLog(AbstractFoo.class);

    ...
}

public class Foo extends AbstractFoo {
    public void someMethod() {
        LOG.info("Using abstract log");
    }
}

2 番目のオプション

クラス、スーパー、サブごとに個別のログを使用します。

public abstract class AbstractFoo {
    private static Log LOG = LogFactory.getLog(AbstractFoo.class);

    ...
}

public class Foo extends AbstractFoo {
    private static Log LOG = LogFactory.getLog(Foo.class);        

    public void someMethod() {
        LOG.info("Using own log");
    }
}

何がより理にかなっており、その理由は何ですか?

4

6 に答える 6

114

私もしません。代わりに、どちらの場合も正しいクラスを使用するようにします。

public abstract class AbstractFoo {
    protected final Log log = LogFactory.getLog(getClass());

    ...
}

public class Foo extends AbstractFoo {
    public void someMethod() {
        log.info("Using abstract log");
    }
}

大量のロギングを行っていない場合 (とにかく良い考えです)、代わりにメソッドを使用できます。

public abstract class AbstractFoo {
    protected Log log() { return LogFactory.getLog(getClass()); }

    ...
}

これを頻繁に呼び出すクラスがある場合は、それをオーバーライドしてキャッシュされたインスタンスを提供できます。

于 2012-08-28T13:44:49.947 に答える
14

これが私の解決策です(最終的な静的ロガー):

public abstract class AbstractFoo {
     protected abstract Log getLogger();
     public doSomething() {
          getLogger().info("log something");
     }
}

public class Foo extends AbstractFoo {
    private static final Log log = Log.getLogger(Foo.class);

    protected Log getLogger() {
         return log;
    }
    public doSomethingElse() {
          log.info("log somethingElse");
    }
}
于 2015-04-08T08:20:25.990 に答える
5

どちらも理にかなっています。アプリケーションによって異なります。

より頻繁に使用される方法は、クラスごとにプライベート ロガーを使用することだと思います。これにより、クラスごととパッケージごとの両方でロギングを構成できます。AbstractFooとは異なるパッケージに属している可能性があり、おそらくログのみFooを表示したいことを覚えておいてください。Foo

protectedさらに、フィールドを書きたい場合は、常によく考えてください。完全に禁止されているわけではありませんが、よく知られた悪い習慣です。コードが読みにくくなり、保守が難しくなります。

于 2012-08-28T13:48:58.413 に答える
0

抽象クラスでロガーを作成すると、ログはすべて、AbstractFoo から発信されたものとしてタグ付けされて出力されます。ログが発生した子クラスでタグ付けされたログを表示する必要がある場合は、子クラスのロガーを作成します。

于 2012-08-28T13:51:01.453 に答える