【问题标题】:How can write logs to a file in btrace?如何将日志写入 btrace 中的文件?
【发布时间】:2010-11-10 09:16:56
【问题描述】:

我有以下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 左右。)

谢谢

【问题讨论】:

    标签: java trace dtrace btrace


    【解决方案1】:

    您可以使用 BTrace 代理 (http://kenai.com/projects/btrace/pages/UserGuide#btrace-agent) 启动您的应用程序。然后您可以为代理指定 scriptOutputFile 参数,调用 println 等生成的所有输出都将转到指定文件而不是标准输出。

    【讨论】:

      【解决方案2】:

      不,BTrace 无法记录到文件,因为它需要尽可能轻量级,以便跟踪结果不受其自身记录的影响。您将不得不重定向到日志文件。

      【讨论】:

        【解决方案3】:

        您可以将控制台输出写入日志文件,如下所示:

        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.....我的个人项目里已经有这个功能了。

        【讨论】:

        • 这个答案非常简洁。尝试具体说明这如何解决问题。
        • 询问如何将btrace日志输出重定向到文件。通常,btrace 日志在命令行中打印。我帖子中的代码将命令行中的 btrace 输出重定向到一个文件中。我的代码中的命令类似于'btrace -cp btrace/build [pid] TraceMethodArgsAndReturn.java'
        • 目前还不清楚您发布的代码(恰好是C#/Windows,而且质量很差)实际上可以用来解决最初问题中所述的问题。更重要的是,与简单地将命令行输出重定向到文件相比有什么优势,例如'btrace ... > btrace.log'.
        猜你喜欢
        • 2013-11-26
        • 1970-01-01
        • 2012-04-06
        • 2023-03-31
        • 2020-01-02
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多