Как записать логи в файл в btrace?

У меня есть следующий скрипт 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. Обратите внимание, если он обрабатывает очень большой вывод 500 МБ или около того.)

Спасибо


person Jayan    schedule 10.11.2010    source источник


Ответы (3)


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

person JB-    schedule 06.12.2010

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

person dogbane    schedule 10.11.2010

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

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

person vcycyv    schedule 13.01.2013
comment
Этот ответ довольно лаконичен. Постарайтесь уточнить, как это может решить вопрос. - person IInspectable; 13.01.2013
comment
Спрашивается, как перенаправить вывод журнала btrace в файл. Обычно журнал btrace печатается в командной строке. Код в моем посте перенаправляет вывод btrace из командной строки в файл. Команда в моем коде выглядит примерно так: «btrace -cp btrace/build [pid] TraceMethodArgsAndReturn.java» - person vcycyv; 16.01.2013
comment
До сих пор неясно, как код, который вы разместили (который, оказывается, только для C#/Windows, и при этом низкого качества) может быть использован для решения проблемы, указанной в исходном вопросе. Что еще более важно, каковы преимущества по сравнению с простым перенаправлением вывода командной строки в файл, например. 'btrace... › btrace.log'. - person IInspectable; 20.01.2013