Форматировать сообщение об исключении, чтобы содержать весь стек в Google Analytics для Android?

Я хотел бы иметь весь стек в отчете Google Analytics для моего мобильного приложения.

Я написал класс, который печатает stacktrace и помещает его в строку, но он не работает.

Мой пользовательский ExceptionParser:

@Override
public String getDescription(String threadName, Throwable throwable) {
    return threadName + " " + getStackTrace(throwable);
}

private String getStackTrace(Throwable throwable) {
    final Writer result = new StringWriter();
    final PrintWriter printWriter = new PrintWriter(result);
    throwable.printStackTrace(printWriter);

    return result.toString();
}

И я установил его так:

EasyTracker.getTracker().setExceptionParser(new StacktraceExceptionParser());

Ответ 1

Приведенный ниже метод объединяет всю трассировку стека в одну разделенную запятыми строку, что может помочь в случае, если Google Analytics возвращает только первую строку. Но все же может быть ограничение по длине, поэтому может быть разумным выполнять фильтрацию, чтобы исключить ненужные вам элементы (см. Комментарий).

 public String getCombinedStackTrace(Throwable aThrowable) {

    final StringBuilder result = new StringBuilder();
    result.append(aThrowable.toString());
    result.append(',');

    String oneElement;

    for (StackTraceElement element : aThrowable.getStackTrace() ) {
        // you can do some filtering here, selecting only the elements you need
        oneElement = element.toString();
        result.append( oneElement );
        result.append( ",");
    }
    return result.toString();
}

Во-вторых, Николай прокомментировал использование библиотеки отчетов об ошибках. Я нашел его чрезвычайно полезным.

Ответ 2

Я знаю, что эта ветка устарела, но я пытаюсь выяснить, как это сделать, но только для полноты есть полезный метод в Log, который делает то, что вы хотите

String stackTraceStr = Log.getStackTraceString(exception);

EDIT: в ответ на комментарий

Я никогда не смог бы работать EasyTracker.getTracker().setExceptionParser(...), infact Я не думаю, что он работает, поэтому я следил за сообщением в блоге здесь http://dandar3.blogspot.co.uk/2013/03/google-analytics-easytracker-detailed.html

Важным моментом в блоге является установка вашего ExceptionParser в обработчике исключений GA:

// Make sure you set the context on EasyTracker first
EasyTracker.getInstance().setContext(this);

// As in in the blog post, we have to get the ExceptionReporter
// in order to set the ExceptionParser
Thread.UncaughtExceptionHandler uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
if (uncaughtExceptionHandler instanceof ExceptionReporter) {
  ExceptionReporter exceptionReporter = (ExceptionReporter) uncaughtExceptionHandler;
  exceptionReporter.setExceptionParser(new AnalyticsExceptionParser());
}

Это сработало для меня и записало более 100 символов.

Ответ 3

Аналитики могут ограничивать размер сообщений, которые вы можете отправить. Я предлагаю использовать реальную библиотеку сообщений об ошибках, например ACRA или BugSense. Вы получите дополнительные функции, такие как информация об устройстве, сведения о конфигурации и лучшее сообщение об ошибках (объединение нескольких исключений, если они имеют один и тот же след и т.д.).