如何将日志写入 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 中的文件?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 NodeJS 中的 Pino 记录器将日志写入文件