Android Log.v(),Log.d(),Log.i(),Log.w(),Log.e() - 何时使用每一个?

时间:2011-10-31 20:19:30

标签: android logcat

不同的LogCat方法是:

Log.v(); // Verbose
Log.d(); // Debug
Log.i(); // Info
Log.w(); // Warning
Log.e(); // Error

使用每种类型的日志记录的适当情况是什么?我知道也许它只是一点点语义,也许它并不重要,但对于Android Studio和Eclipse中的LogCat过滤,我很高兴知道我在适当的时候使用了正确的方法

7 个答案:

答案 0 :(得分:694)

让我们按相反的顺序进行:

  • Log.e:这是为了发生坏事。在catch语句中使用此标记。您知道发生了错误,因此您正在记录错误。

  • Log.w:当您怀疑阴影正在发生时使用此选项。您可能无法在错误模式下完全完整,但也许您从某些意外行为中恢复过来。基本上,使用它来记录您不希望发生的事情,但不一定是错误。有点像“嘿,这发生了,而且它是奇怪的,我们应该调查它。”

  • Log.i:使用此功能将有用的信息发布到日志中。例如:您已成功连接到服务器。基本上用它来报告成功。

  • Log.d:将此用于调试目的。如果要打印出大量消息,以便记录程序的确切流程,请使用此方法。如果要保留变量值的日志,请使用此。

  • Log.v:当您想要完全记录日志时,请使用此选项。如果由于某种原因您决定在应用程序的特定部分记录每个小东西,请使用Log.v标记。

作为奖励...

  • Log.wtf:当东西绝对,可怕,神圣错误时使用它。你知道那些你正在捕捉从不应该得到的错误的捕获块...是的,如果你想记录它们使用Log.wtf

答案 1 :(得分:18)

不同的方法是优先权的指示。正如你已经列出的那样,它们从最不重要到最重要。我认为你如何将它们专门映射到代码中的调试日志取决于你正在处理的组件或应用程序,以及Android如何在不同的构建版本(eng,userdebug和user)上处理它们。我在Android中的原生守护进程中做了大量的工作,这就是我的工作方式。它可能不会直接应用于您的应用,但可能存在一些共同点。如果我的解释听起来含糊不清,那是因为其中一些更像是一门艺术,而不是一门科学。我的基本规则是尽可能高效,确保您可以合理地调试组件而不会破坏系统的性能,并始终检查错误并记录它们。

V - 以不同的间隔或在我的组件处理的任何事件发生时打印状态。也可能非常详细地打印我的组件接收或发送的消息/事件的有效负载。

D - 我的组件中发生的次要事件的详细信息,以及组件接收或发送的消息/事件的有效负载。

I - 我的组件接收或发送的任何消息/事件的标头,以及对我的组件操作至关重要的有效负载的任何重要部分。

W - 发生任何异常或可疑的事情,但不一定是错误。

E - 错误,意思是当事情按照应有的方式运作时不应发生的事情。

我看到人们犯的最大错误是他们过度使用V,D和I之类的东西,但从不使用W或E.如果错误是,根据定义,不应该发生,或者应该很少发生,那么当它发生时记录消息是非常便宜的。另一方面,如果每次有人按下一个键你都会执行Log.i(),那么你就会滥用共享的日志记录资源。当然,使用常识并注意控制之外的错误日志(如网络错误)或紧密循环中包含的错误日志。

可能不好

Log.i("I am here");

不可

Log.e("I shouldn't be here");

考虑到这一切,您的代码越接近“生产就绪”,您就越能限制代码的基本日志记录级别(您需要在alpha中使用V,在beta中使用D,在生产中使用D,或者甚至可能需要W在生产中)。您应该运行一些简单的用例并查看日志,以确保在应用更严格的过滤时,您仍然可以大部分了解正在发生的情况。如果您使用下面的过滤器运行,您仍然可以告诉您的应用正在做什么,但可能无法获得所有详细信息。

logcat -v threadtime MyApp:I *:S

答案 2 :(得分:6)

The source code提供了一些基本指导:

  

详细程度的顺序,从最少到最多,是ERROR,WARN,INFO,DEBUG,VERBOSE。除了在开发期间,不应该将详细编译到应用程序中。调试日志在运行时编译但被剥离。始终保留错误,警告和信息日志。

更多细节,Kurtis'答案已经死了。我想补充一点:不要在INFO或以上(WARN / ERROR)记录任何个人身份信息或隐私信息。否则,错误报告或包含日志记录的任何其他内容都可能被污染。

答案 3 :(得分:3)

我认为这些不同类型的日志记录的重点是,如果您希望您的应用程序基本上自我过滤自己的日志。因此,Verbose可以在您的应用程序中记录绝对重要的一切,然后调试级别将记录详细日志的子集,然后Info级别将记录调试日志的子集。当您开始使用错误日志时,您只想记录可能发生的任何类型的错误。还有一个名为Fatal的调试级别,用于在您的应用中真正击中粉丝的时候。

一般来说,你是对的,它基本上是随意的,你可以自己定义什么是调试日志,而不是信息,对比和错误等等。

答案 4 :(得分:2)

Android Studio website最近(我认为)提供了一些建议,可以从不同的日志级别获得什么样的消息,这些消息可能与Kurtis'回答:

  • 详细 - 显示所有日志消息(默认值)。
  • 调试 - 显示仅在开发期间有用的调试日志消息,以及此列表中较低的消息级别。
  • 信息 - 显示正常使用的预期日志消息,以及此列表中较低的消息级别。
  • 警告 - 显示尚未发生错误的可能问题,以及此列表中较低的邮件级别。
  • 错误 - 显示导致错误的问题,以及此列表中较低的邮件级别。
  • 断言 - 显示开发人员期望永远不会发生的问题。

答案 5 :(得分:2)

您可以使用LOG,例如:

Log.e(String, String) (error)
Log.w(String, String) (warning)
Log.i(String, String) (information)
Log.d(String, String) (debug)
Log.v(String, String) (verbose)

示例代码:

private static final String TAG = "MyActivity";
...
Log.i(TAG, "MyClass.getView() — get item number " + position);

答案 6 :(得分:2)

即使已经回答了这个问题,我仍认为答案中缺少示例。

因此,我将把我在博客文章"Android Log Levels" 中写的内容带到这里

详细

是最低级别的日志记录。如果您想对日志记录有所了解,则可以使用此级别。我从不了解何时使用Verbose和何时使用Debug。这种差异在我看来非常武断。当我指出Android¹的源代码后,“我终于明白了。除非在开发过程中,否则不应将Verbose编译到应用程序中。”现在我很清楚,无论何时开发,并想添加可删除的日志来帮助您。开发中,具有详细级别很有用,这将有助于您在投入生产之前删除所有这些日志。

调试

用于调试目的。这是应该生产的最低级别。此处提供的信息可在开发过程中提供帮助。大多数情况下,您会在生产环境中禁用此日志,以便发送的信息较少,只有在遇到问题时才启用此日志。我想登录调试应用程序从服务器发送/接收的所有信息(请注意不要记录密码!!!)。这对于了解错误是否在服务器或应用程序中很有帮助。我还会记录重要功能的进入和退出情况。

信息

有关突出显示应用程序进度的参考消息。例如,当应用程序初始化完成时。用户在活动和片段之间移动时添加信息。记录每个API调用,但只记录一些信息,例如URL,状态和响应时间。

警告

当存在潜在有害情况时。

根据我的经验,此日志非常复杂。您什么时候有潜在的有害情况?总体来说还是可以的,或者是错误的。我个人并不经常使用此级别。我使用它的示例通常是发生多次情况。例如,用户输入的错误密码超过3次。这可能是因为他输入了3次错误的密码,也可能是因为我们的系统无法接受该字符的问题。网络连接问题也是如此。

错误

错误事件。出现错误后,应用程序仍可以继续运行。例如,当我得到一个不应该获得空指针的空指针时。解析服务器的响应时出错。服务器出了错。

WTF(多么严重的失败)

致命错误是针对严重错误事件的,它将导致应用程序退出。在Android中,致命的实际上是错误级别,不同之处在于它还会添加完整堆栈。