如何将日志写入 btrace 中的文件?

Posted

技术标签:

【中文标题】如何将日志写入 btrace 中的文件?【英文标题】:How can write logs to a file in 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 左右。)

谢谢

【问题讨论】:

【参考方案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'.

以上是关于如何将日志写入 btrace 中的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将输出写入 Android 中的 Log?

无法使用 NodeJS 中的 Pino 记录器将日志写入文件

如何在java中将错误日志或异常写入文件

ActiveJob + Sidekiq 6.0.3:如何写入日志文件?

如何将所有系统输出写入JAVA中的文件?

Windows-Service 中的 Serilog 未写入日志文件