0

車輪を再発明する前に、すべてのクラスでsay("We are here.");定義せずに、 などのコードにデバッグ トレースを挿入できるようにしたいと考えています。static void say()実行する必要がありSystem.out.println(s)、グローバルにオンまたはオフに切り替える必要があります(doSay(false))。また、呼び出し元のクラスを識別できるようにしたいと思います(here で説明されているように)。例えば:

MyClass: 私たちはここにいます。

Javaにはすでにそのようなツールがありますか?

4

7 に答える 7

3

log4jではなく SLF4j を使用してください(少なくとも、直接ではありません)。どちらも同じ作者であるCeki Gülcüによって作成されていますが、SLF4J には、使用中の log4j を見て得た知識と、他のロギング パッケージの進歩を見て得た知識が組み込まれています。

SLF4J は、log4j やパッケージなど、さまざまな基礎となるロギング システムの共通 A java.util.logging​​PI です。独自の「ネイティブ」実装である logback もあります。

log4j よりも優れている理由の 1 つは、メッセージ テンプレートのサポートです。これらにより、コードがよりシンプルになります。

また、ライブラリにロギングを含めることができますが、ライブラリのユーザーにロギングの実装を選択させます。このようなものがなければ、ユーザーは私のライブラリのためだけにログを構成する必要があり、アプリケーションの残りの部分と統合されません。

于 2011-08-04T22:26:14.153 に答える
1

最も一般的な Java ロギング フレームワークはLog4Jで、これはこれ (およびその他の機能) を実行します。

その他の一覧はこちらをご覧ください。

于 2011-08-04T22:18:36.120 に答える
1

はい。これはロギング フレームワークと呼ばれます。Javaにはjava.util.logging. しかし、多くの人はLog4Jの使用を好みます。

于 2011-08-04T22:19:24.583 に答える
0

Apache のLog4Jのようなロガーを使用して、logger.trace("We are here");. オフにしたい場合は、構成でログレベルを高く (デバッグ、警告、エラー) に設定すると、traceログが消えます。

于 2011-08-04T22:19:54.217 に答える
0

Java には、log4j や logback などのより高度なロギング ツールがあります。そこで を作成しpublic static final Logger logger = Logger.getLogger(..)、ロガーを使用してデバッグ/情報/警告/エラー メッセージを好きな場所に書き込む必要があります。それらは高度に構成可能です-何をどこに記録するか。

より単純なケース (おもちゃのプロジェクトの場合) では、public static void log(..)メソッドを使用してクラスを定義し、すべてのクラスから使用できます。

于 2011-08-04T22:20:23.360 に答える
0

Main.java で関数を static 宣言して、それをオールラウンドに使用してみませんか?

public class Main {

    private static boolean debug;

    public static void setDebug(boolean d) { Main.debug = d; }

    public static void say(String s) { if(Main.debug) System.out.println(s); }

}

これがあなたのニーズに合うかどうか教えてください。

編集:コードを修正

于 2011-08-04T22:21:17.043 に答える
0

静的インポートについて知りませんでした!@ninetwozero、@karl、@erickson からのアイデアを組み合わせて、これを作成しました。

package myPkg;
public class CLHUtilities {

    private static boolean saying = false;
    public static void tracing(boolean b) {
        saying = b;
    }

    /*
     * Technique taken from:
     * http://stackoverflow.com/questions/282977/which-class-invoked-my-static-method
     */
    public static void say(String s) {
        if (saying) {
            Throwable t = new Throwable();
            StackTraceElement[] trace = t.getStackTrace();
            String className = trace[1].getClassName();
            String whoCalledMe = null;
            try {
                whoCalledMe = Class.forName(className).getSimpleName();
            } catch (Exception e) {
            }
            System.out.println(whoCalledMe + ": " + s);
        }

    }
}

これは次のように単純に使用できます。

import static myPkg.CLHUtilities.*;
 :
tracing(true);
 :
say("We are here.");

これは私のニーズに完全に合っています。

于 2011-08-05T16:12:40.570 に答える