处理 Fabric/Crashlytics 中的错误分组
Handle grouping of errors in Fabric/Crashlytics
我有一个使用 Fabric/crashlytics 的项目。为了能够检测生产中的所有运行时错误,我想使用以下方式向 Crashlytics 发送(非致命)异常:
Crashlytics.logException(new RuntimeException("some identifiable error message");
我想将此逻辑添加到我们现有的 Log-class 项目中,该项目通过 gradle 作为单独的 "utilities-module" 加载。由于此模块不包含对 Crashlytics 的引用(而且我似乎找不到从主模块转发此引用的好方法),我通过引入一个从主应用程序实现的接口解决了这个问题:
if (!BuildConfig.APP_BUILD_VERSION.equals("local")) {
UtilitiesConfig.setExternalLogger(new Logger.ExternalLogger() {
@Override
public void reportError(String tag, String message, Throwable throwable) {
Crashlytics.logException(new RuntimeException(TextUtils.isEmpty(tag) ? message : tag + ": " + message));
}
});
}
这工作正常,唯一的问题是 Fabric 中的所有报告都被归为一个类似的异常,因为堆栈跟踪的顶行是相似的(即界面和应用程序)。例如:
Non-fatal Exception: java.lang.RuntimeException: c: onNetworkError, type: CANT_ACCESS_SERVER
at my.package.Application.reportError(Application.java:234)
at my.package.utilities.Logger.e(Logger.java:34)
at my.package.utilities.net.CallbackCallable.onNetworkError(CallbackCallable.java:76)
at my.package.utilities.net.MsgCallable.onNetworkError(MsgCallable.java:250)
at my.package.utilities.net.CancellableCallable.call(CancellableCallable.java:80)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:776)
...还有这个:
Non-fatal Exception: java.lang.RuntimeException: u: Cannot update
at my.package.Application.reportError(Application.java:234)
at my.package.utilities.Logger.e(Logger.java:43)
at my.package.NTPManager$SyncTimeAsyncTask.doInBackground(NTPManager.java:150)
at my.package.NTPManager$SyncTimeAsyncTask.doInBackground(NTPManager.java:133)
at android.os.AsyncTask.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
尽管它们是源自不同 classes/rows 且具有不同错误消息的两个不同错误,但它们都被归为一组。
是否有一种有效的方法来更改 Crashlytics 中的某些配置,或者以另一种方式通过所述回调报告它,从而使 Fabric 不将它们视为相同的错误?
自以来,如果您使用传递给reportError
的throwable
并将其设置为您创建的异常的cause
,您应该会得到想要的结果.
if (!BuildConfig.APP_BUILD_VERSION.equals("local")) {
UtilitiesConfig.setExternalLogger(new Logger.ExternalLogger() {
@Override
public void reportError(String tag, String message, Throwable throwable) {
String logMessage = TextUtils.isEmpty(tag) ? message : tag + ": " + message;
Crashlytics.logException(new RuntimeException(logMessage, throwable));
}
});
}
我有一个使用 Fabric/crashlytics 的项目。为了能够检测生产中的所有运行时错误,我想使用以下方式向 Crashlytics 发送(非致命)异常:
Crashlytics.logException(new RuntimeException("some identifiable error message");
我想将此逻辑添加到我们现有的 Log-class 项目中,该项目通过 gradle 作为单独的 "utilities-module" 加载。由于此模块不包含对 Crashlytics 的引用(而且我似乎找不到从主模块转发此引用的好方法),我通过引入一个从主应用程序实现的接口解决了这个问题:
if (!BuildConfig.APP_BUILD_VERSION.equals("local")) {
UtilitiesConfig.setExternalLogger(new Logger.ExternalLogger() {
@Override
public void reportError(String tag, String message, Throwable throwable) {
Crashlytics.logException(new RuntimeException(TextUtils.isEmpty(tag) ? message : tag + ": " + message));
}
});
}
这工作正常,唯一的问题是 Fabric 中的所有报告都被归为一个类似的异常,因为堆栈跟踪的顶行是相似的(即界面和应用程序)。例如:
Non-fatal Exception: java.lang.RuntimeException: c: onNetworkError, type: CANT_ACCESS_SERVER
at my.package.Application.reportError(Application.java:234)
at my.package.utilities.Logger.e(Logger.java:34)
at my.package.utilities.net.CallbackCallable.onNetworkError(CallbackCallable.java:76)
at my.package.utilities.net.MsgCallable.onNetworkError(MsgCallable.java:250)
at my.package.utilities.net.CancellableCallable.call(CancellableCallable.java:80)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:776)
...还有这个:
Non-fatal Exception: java.lang.RuntimeException: u: Cannot update
at my.package.Application.reportError(Application.java:234)
at my.package.utilities.Logger.e(Logger.java:43)
at my.package.NTPManager$SyncTimeAsyncTask.doInBackground(NTPManager.java:150)
at my.package.NTPManager$SyncTimeAsyncTask.doInBackground(NTPManager.java:133)
at android.os.AsyncTask.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
尽管它们是源自不同 classes/rows 且具有不同错误消息的两个不同错误,但它们都被归为一组。
是否有一种有效的方法来更改 Crashlytics 中的某些配置,或者以另一种方式通过所述回调报告它,从而使 Fabric 不将它们视为相同的错误?
自reportError
的throwable
并将其设置为您创建的异常的cause
,您应该会得到想要的结果.
if (!BuildConfig.APP_BUILD_VERSION.equals("local")) {
UtilitiesConfig.setExternalLogger(new Logger.ExternalLogger() {
@Override
public void reportError(String tag, String message, Throwable throwable) {
String logMessage = TextUtils.isEmpty(tag) ? message : tag + ": " + message;
Crashlytics.logException(new RuntimeException(logMessage, throwable));
}
});
}