Как можно записывать логи в файл в btrace? - PullRequest
4 голосов
/ 10 ноября 2010

У меня следующий скрипт 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 не позволяет создавать новые объекты.

(Очевидный обходной путь - перенаправление в файл. Другой вариант - использовать плагин Visualtram btrace - затем выходные данные переходят в окно visualVM. Обратите внимание, что это очень большой дескрипторвывод 500Мб или около того.)

Спасибо

Ответы [ 3 ]

5 голосов
/ 06 декабря 2010

Вы можете запустить ваше приложение с агентом BTrace (http://kenai.com/projects/btrace/pages/UserGuide#btrace-agent). Затем вы можете указать scriptOutputFile аргумент для агента, и все выходные данные, сгенерированные при вызовах println и т. Д., Будут перейти к указанному файлу вместо стандартного вывода.

1 голос
/ 10 ноября 2010

Нет, BTrace не может войти в файл, поскольку он должен быть как можно более легким, чтобы на результаты трассировки не влияла его собственная регистрация. Вместо этого вам придется перенаправить в файл журнала.

0 голосов
/ 13 января 2013

Вы можете записать вывод консоли в файл журнала следующим образом:

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 ..... У меня уже есть эта функция в моем личном проекте.

...