4

次のbtraceスクリプトがあります。特定のクラスの関数の開始と終了を記録したいと思います。

..
package com.sun.btrace.samples;

import com.sun.btrace.BTraceUtils;
import com.sun.btrace.Profiler;
import com.sun.btrace.annotations.*;
@BTrace class Profiling {
@Property
Profiler swingProfiler = BTraceUtils.Profiling.newProfiler();

@OnMethod(
    clazz="com.pkg.classname", 
    method="/.*/")
    void entry(@ProbeMethodName(fqn=true) String probeMethod) {
        BTraceUtils.print("Entry" );
        BTraceUtils.println(BTraceUtils.timestamp() );
        BTraceUtils.println(probeMethod);
    }

@OnMethod(
    clazz="com.pkg.classname", 
    location=@Location(value=Kind.RETURN)
    )
    void exit(@ProbeMethodName(fqn=true) String probeMethod, @Duration long duration) {
        BTraceUtils.print("Exit:" );
        BTraceUtils.println(BTraceUtils.timestamp() );
        BTraceUtils.println(probeMethod);
    }

}

これにより、コンソールに出力が表示されます。結果をファイルに書き込むにはどうすればよいですか?Btraceでは、新しいオブジェクトを作成できません。

(明らかな回避策はファイルにリダイレクトすることです。別の選択肢は、VisualVM btraceプラグインを使用することです。出力はvisualVMウィンドウに送られます。500Mb程度の非常に大きな出力を処理するかどうかを確認してください。)

ありがとう

4

3 に答える 3

5

BTraceエージェント(http://kenai.com/projects/btrace/pages/UserGuide#btrace-agent)を使用してアプリケーションを開始できます。次に、 scriptOutputFile引数をエージェントに指定できます。printlnなどの呼び出しによって生成されたすべての出力は、stdoutではなく指定されたファイルに送られます。

于 2010-12-06T08:52:06.920 に答える
1

いいえ、BTraceはファイルにログを記録できません。これは、トレース結果が自身のログの影響を受けないように、可能な限り軽量である必要があるためです。代わりに、ログファイルにリダイレクトする必要があります。

于 2010-11-10T09:58:17.150 に答える
-2

次のように、コンソール出力をログファイルに書き込むことができます。

Process p = Runtime.getRuntime().exec("cmd /c " + command);
StringBuffer output = new StringBuffer("");
if (p != null) {
    BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String buf = "";
    try {
        int count = 0;
        while ((buf = is.readLine()) != null) {
            output.append(buf);
            output.append(System.getProperty("line.separator"));
            if(++count % flushLineNumber == 0){
                FileUtils.writeStringToFile(file, output.toString(), true);
                output.setLength(0);
            }
        }
        is.close();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

コマンドはbrtrace.....私はすでに私の個人的なプロジェクトでこの機能を持っています。

于 2013-01-13T09:35:35.027 に答える