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等生成的所有输出将转到指定文件而不是标准输出。

于 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 回答