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

Jak*_*son 317 android logcat

不同的LogCat方法是:

Log.v(); // Verbose
Log.d(); // Debug
Log.i(); // Info
Log.w(); // Warning
Log.e(); // Error
Run Code Online (Sandbox Code Playgroud)

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

Kur*_*aum 703

我们按相反顺序进行:

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

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

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

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

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

作为奖励......

  • Log.wtf:当东西绝对可怕时,使用这个,可怕的,神圣的错误.你知道那些捕获块,你捕获的错误,你永远不会得到...是的,如果你想记录它们使用Log.wtf

  • wtf代表"多么可怕的失败" (48认同)
  • 我不相信`Log.wtf`我甚至检查了几次并且大声笑了..在我看来,所有的API都应该有这样的内容 (8认同)
  • 谁命名这些方法?那是一个可怕的主意。我不知道我的团队如果只用1个字母名称来命名我的东西,该怎么办?打赌他们会让我下地狱? (5认同)
  • 嗨朋友!我终于发现自己在Google上做了一些Android工作.我试图弄清楚如何记录事物时遇到了这个问题.:) (2认同)

Joh*_*lau 18

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

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

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

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

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

E - 错误,意味着当事情按预期工作时不应发生的事情.

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

也许不好

Log.i("I am here");
Run Code Online (Sandbox Code Playgroud)

Log.e("I shouldn't be here");
Run Code Online (Sandbox Code Playgroud)

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

logcat -v threadtime MyApp:I *:S
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用 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)
Run Code Online (Sandbox Code Playgroud)

示例代码:

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


Mat*_*ead 6

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

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

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


Eli*_*old 6

即使已经回答了这个问题,但我觉得回答中缺少示例。

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

冗长的

是最低级别的日志记录。如果你想对日志发狂,那么你就选择这个级别。我一直不明白什么时候使用 Verbose 以及什么时候使用 Debug。这种差异对我来说听起来很随意。当我指向 Android 的源代码时,我终于明白了¹“除非在开发过程中,否则永远不应将 Verbose 编译到应用程序中。” 现在我很清楚,无论何时您正在开发并希望添加可在开发过程中帮助您的可删除日志,拥有详细级别这将帮助您在进入生产之前删除所有这些日志很有用。

调试

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

信息

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

警告

当存在潜在的有害情况时。

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

错误

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

WTF(多么可怕的失败)

Fatal 是针对将导致应用程序退出的严重错误事件。在 Android 中,致命的实际上是 Error 级别,不同的是它还添加了 fullstack。