0

2 つのクラス間のロギングのデフォルト コードから始めましょう。

実装:

クラスA:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.cc.B;

public class A {

    public static Log logger = LogFactory.getLog(A.class);

    public static void main(String[] args) {

        logger.info("Entering application.");
        B b = new B();
        b.doIt();
        logger.info("Exiting application.");
    }
}

クラス B:

package com.cc;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class B {
    public static Log log = LogFactory.getLog(B.class);

       public void doIt() {
         log.debug("Did it");
       }
}

実行:

16 mars 2012 09:31:35 com.cc.A main
INFO: Entering application.
16 mars 2012 09:31:35 com.cc.B doIt
INFO: Did it
16 mars 2012 09:31:35 com.cc.A main
INFO: Exiting application.

B クラスでは、 に置き換えpublic static Log log = LogFactory.getLog(B.class);public static Log log = LogFactory.getLog(A.class);もアプリケーションのログには影響しません。

クラス A ロガーにのみログインするにはどうすればよいですか?

4

2 に答える 2

0

私はこの出力を取得します:

2012-03-17 18:13:37,859 INFO  main cc.A Entering application.
2012-03-17 18:13:37,861 DEBUG main cc.A Did it
2012-03-17 18:13:37,861 INFO  main cc.A Exiting application.

Aのこのコードで:

package com.cc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cc.B;

public class A {
    static final Logger logger = LoggerFactory.getLogger(A.class);
    public static void main(String[] args) {
        logger.info("Entering application.");
        B b = new B();
        b.doIt();
        logger.info("Exiting application.");
    }
}

そしてBのこのコード:

package com.cc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class B {
    private static final Logger logger = LoggerFactory.getLogger(A.class);
    public void doIt() {
        logger.debug("Did it");
    }
}

そして、log4jのこの設定:

log4j.rootCategory      =   DEBUG, A1
log4j.appender.A1       =   org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout                    = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern  = %d %-5p %t %c{2} %m%n

しかし、各ログ行でアプリケーションを識別する何かを本当に持っているのかどうか疑問に思わずにはいられませんか?その場合は、アプリケーション名をログパターンに追加するだけです。

log4j.appender.A1.layout.ConversionPattern  = %d %-5p %t %c{2} MyApplicationName %m%n

次に、Bを次のようにinitloggerに戻した場合:

    private static final Logger logger = LoggerFactory.getLogger(B.class);

代わりに、次の出力があります。

2012-03-17 18:13:37,859 INFO  main cc.A MyApplicationName Entering application.
2012-03-17 18:13:37,861 DEBUG main cc.B MyApplicationName Did it
2012-03-17 18:13:37,861 INFO  main cc.A MyApplicationName Exiting application.
于 2012-03-17T17:19:24.320 に答える
0

最初に、ログ メッセージの発信元を知りたいという quaylar の意見に同意します。そのため、これはコード レビューにおいて悪い習慣であると言えます。

2 番目: 使用するすべてのサード パーティ ライブラリのすべてのログ フレームワークを好みのログ フレームワークにブリッジできるように、常に slf4j を使用する必要があると思います。

そうは言っても、BがAと同じロガーをインスタンス化することを確認した場合、代わりにlog4jを使用すると、達成したいことを達成できます.

より簡単な解決策は、A で定義されたロガーを B に静的にインポートすることです。

import static com.cc.A.logger;

そしてそれをBで使用します:

public void doIt() {
    logger.debug("Did it");
}
于 2012-03-16T11:42:36.123 に答える