我已经看过了android.util.Log的文件,我不知道到底是什么之间的差异Log.e(),并Log.wtf()为。一个比另一个更好吗?功能上有区别吗?当然,它们不是多余的。
致将来的读者注意:在问这个问题时,有关此文档的内容还不清楚。如果您点击上面的链接,他们已经解决了问题。
我已经看过了android.util.Log的文件,我不知道到底是什么之间的差异Log.e(),并Log.wtf()为。一个比另一个更好吗?功能上有区别吗?当然,它们不是多余的。
致将来的读者注意:在问这个问题时,有关此文档的内容还不清楚。如果您点击上面的链接,他们已经解决了问题。
Answers:
严重程度有所不同;
Log.e() 只会将错误记录到优先级为ERROR的日志中。
Log.wtf() 将记录优先级为ASSERT的错误,并可能(取决于系统配置)发送错误报告并立即终止程序。
Log.e() 简单地将错误记录到优先级为ERROR的日志中。
Log.wtf()(多么可怕的失败)比错误日志更严重。从未发生过的错误。在终止程序之前,它可能会强制设备保持写入日志的状态。
官方文档说:
Log.e()优先级为ERROR的日志。但是,Log.wtf()优先级为ASSERT的日志。
ASSERT的优先级常数= 7
ERROR的优先级常数= 6
因此Log.wtf()对于Log.e()
但是,源代码 与以上信息冲突。
static int wtf(int logId, String tag, String msg, Throwable tr,boolean localStack, boolean system) {
TerribleFailure what = new TerribleFailure(msg, tr);
// Only mark this as ERROR, do not use ASSERT since that should be
// reserved for cases where the system is guaranteed to abort.
// The onTerribleFailure call does not always cause a crash.
int bytes = printlns(logId, ERROR, tag, msg, localStack ? what : tr);
...
}
官方文档中似乎有一个错误。因为两者Log.wtf()和Log.e()日志的优先级均为ERROR。
Log.e()的源代码:
public static int e(@Nullable String tag, @Nullable String msg,@Nullable Throwable tr) {
return printlns(LOG_ID_MAIN, ERROR, tag, msg, tr);
}
区别在于Log.wtf()可能会调用onTerribleFailure()进行回调。
onTerribleFailure()可能会或可能不会导致进程终止(取决于系统设置)。
TL; DR
Log.wtf()可能会调用onTerribleFailure()并可能导致应用程序终止。
实际上,这可能是Android SDK中的文档错误,这真是令人惊讶... Doc说:
该错误将始终在调用堆栈的ASSERT级别记录。
但是源代码这样说:
static int wtf(int logId, String tag, String msg, Throwable tr, boolean localStack, boolean system) {
...
int bytes = printlns(logId, ERROR, tag, msg, localStack ? what : tr);
...
}
因此,Log.wtf()和Log.e()都具有相同的优先级,即ERROR。
区别在于Log.wtf()调用onTerribleFailure()进行回调,该回调“报告当前进程中的严重错误。可能会或可能不会导致进程终止(取决于系统设置)”。
因此,换句话说,Log.wtf()可能会使您的应用程序崩溃。
下面是一个代码片段:
if (ActivityManager.getService().handleApplicationWtf(
mApplicationObject, tag, system,
new ApplicationErrorReport.ParcelableCrashInfo(t))) {
// The Activity Manager has already written us off -- now exit.
Process.killProcess(Process.myPid());
System.exit(10);
}
与其他日志记录类型一样,我知道它只是日志消息的另一种标签类型。log.i用于获取有关发生位置的信息。log.e用于可能发生的错误。log.wtf用于永远不会发生的错误。我认为这只是一种便利,所以您不需要Log(“ ERROR:”,“ an error”)和Log(“ INFO:”,“ information”)