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

不同的LogCat方法有:

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

哪种情况适合使用每种类型的日志记录?我知道也许这只是一点语义,也许它真的不重要,但对于Android Studio和Eclipse中的LogCat过滤,如果知道我在适当的时候使用了适当的方法就好了。

339362 次浏览

让我们倒着来看看:

  • 日志。e:当不好的事情发生时。在catch语句中使用此标记。您知道发生了错误,因此您记录了一个错误。

  • 日志。w:当你怀疑有可疑的事情发生时使用这个。您可能没有完全处于错误模式,但可能从一些意想不到的行为中恢复过来。基本上,使用它来记录您没有期望发生但不一定是错误的事情。有点像“嘿,这发生了,这奇怪,我们应该调查一下。”

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

  • 日志。d:用于debugging。如果您想打印一堆消息,以便记录程序的确切流程,请使用此选项。如果你想保存变量值的日志,可以使用这个。

  • 日志。v:当你想要完全疯狂地记录日志时使用这个。如果出于某种原因,你决定记录应用程序特定部分的每一件小事,请使用日志。v标签。

作为奖励…

  • < >强Log.wtf < / >强:当事情发生了绝对的、可怕的、该死的错误时使用这个。你知道那些你正在捕捉从来没有应该得到的错误的catch块…是的,如果你想记录他们使用log .wtf

我认为这些不同类型日志的意义在于如果你想让你的应用程序自我过滤它自己的日志。所以详细可以是记录应用程序中所有重要的东西,然后调试级别将记录详细日志的子集,然后信息级别将记录调试日志的子集。当您开始查看错误日志时,您只需要记录可能发生的任何类型的错误。还有一个名为Fatal的调试级别,用于在应用中出现真正的问题。

一般来说,您是对的,它基本上是任意的,由您来定义什么是调试日志、什么是信息日志、什么是错误日志等等。

不同的方法是优先级的标志。正如你所列出的,它们是由最不重要到最重要的。我认为你在代码中如何将它们映射到调试日志取决于你正在处理的组件或应用程序,以及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");

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

logcat -v threadtime MyApp:I *:S

源代码提供了一些基本的指导:

从最少到最多的顺序是ERROR, WARN, INFO, DEBUG, VERBOSE。除非在开发期间,否则决不应该将Verbose编译到应用程序中。调试日志在运行时被编译,但在运行时被剥离。错误、警告和信息日志总是被保存。

要了解更多细节,柯蒂斯的回答非常中肯。我只想补充一句:不要在INFO或以上(WARN/ERROR)记录任何个人身份或私人信息。否则,错误报告或任何包含日志记录的内容都可能受到污染。

Android Studio网站最近(我认为)提供了一些建议,从不同的日志级别中期望什么样的消息可能是有用的,以及Kurtis的回答:

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

你可以使用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);

尽管这个问题已经被回答了,但我觉得在已经回答的答案中还缺少一些例子。

因此,我将在这里带来我在博客文章“Android日志级别”中所写的内容

详细的

是最低级别的日志记录。如果你想疯狂地使用日志记录,那么你可以使用这个级别。我从来不知道什么时候使用Verbose,什么时候使用Debug。在我听来,这种差别太武断了。当我看到Android的源代码¹时,我终于明白了它的含义:“除非在开发过程中,否则Verbose永远不应该编译到应用程序中。”现在我清楚了,无论何时您正在开发并想要添加可删除的日志来帮助您在开发过程中,拥有详细级别都是有用的,这将帮助您在进入生产环境之前删除所有这些日志。

调试

用于调试目的。这是生产中应该达到的最低水平。这里的信息是为了在开发过程中提供帮助。大多数情况下,您将在生产环境中禁用此日志,以便发送更少的信息,并且仅在遇到问题时启用此日志。我喜欢登录调试应用程序从服务器发送/接收的所有信息(注意不要记录密码!!)这对于了解错误是在服务器还是应用程序非常有帮助。我还记录了重要功能的进入和退出。

信息

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

警告

当出现潜在的有害情况时。

根据我的经验,这个日志是一个棘手的级别。什么时候你会遇到潜在的有害情况?一般来说,这是可以的,或者这是一个错误。我个人不怎么使用这个关卡。我使用它的例子通常是当事情发生了几次。例如,用户密码输入错误3次以上。这可能是因为他输入了错误的密码3次,也可能是因为有一个字符在我们的系统中不被接受。网络连接问题也是如此。

错误

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

WTF(多么可怕的失败)

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