【问题标题】:Android Log.v(), Log.d(), Log.i(), Log.w(), Log.e() - When to use each one?Android Log.v()、Log.d()、Log.i()、Log.w()、Log.e() - 什么时候使用它们?
【发布时间】:2011-12-19 01:04:09
【问题描述】:

不同的LogCat 方法是:

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

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

【问题讨论】:

  • 还记得使用自定义日志。在针对特定场景时,它们非常有用。

标签: android logcat


【解决方案1】:

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

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

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

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

  • Log.d:将其用于调试目的。如果您想打印出一堆消息以便记录程序的确切流程,请使用它。如果您想保留变量值的日志,请使用它。

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

作为奖励......

  • Log.wtf:当事情发生绝对、可怕、糟糕的错误时使用这个。您知道那些捕获错误的捕获块,这些错误是您永远应该得到的......是的,如果你想记录它们,请使用 Log.wtf

【讨论】:

  • 嘿伙计!我终于发现自己在 Google 做一些 Android 工作。我在试图弄清楚如何记录事情时遇到了这个问题。 :)
  • 我不相信Log.wtf 我什至检查了几次并大声笑了起来.. 在我看来,所有的 API 都应该有这样的东西
  • 我建议Log.vLog.i 一起使用。使用Log.i 报告连接成功,然后使用Log.v 提供有关该连接的更多详细信息。
  • wtf 代表“多么可怕的失败”
  • 谁命名了这些方法?这是一个可怕的想法。我想知道如果我只用 1 个字母命名我的东西,我的团队会如何感激。打赌他们会把我送到地狱?
【解决方案2】:

不同的方法是优先级的指示。正如您列出的那样,它们从最不重要到最重要。我认为您如何将它们具体映射到代码中的调试日志取决于您正在处理的组件或应用程序,以及 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,在生产中需要 I,甚至可能W 在生产中)。您应该浏览一些简单的用例并查看日志,以确保您在应用更多限制性过滤时仍然可以大致了解正在发生的事情。如果您使用下面的过滤器运行,您应该仍然能够知道您的应用在做什么,但可能无法获得所有详细信息。

logcat -v threadtime MyApp:I *:S

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      有关更多详细信息,Kurtis 的回答已完结。我只想补充一点:不要在INFO 或更高版本(WARN/ERROR)上记录任何个人身份或私人信息。否则,可能会污染错误报告或其他任何包括日志记录的内容。

      【讨论】:

        【解决方案5】:

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

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

        详细

        是最低级别的日志记录。如果您想疯狂地进行日志记录,那么您可以使用此级别。我从来不明白何时使用 Verbose 以及何时使用 Debug。对我来说,这种差异听起来很随意。当我看到 Android 的源代码时,我终于明白了¹“Verbose 不应该被编译到应用程序中,除非是在开发过程中。”现在我很清楚,每当您正在开发并想要添加可删除的日志以在开发过程中为您提供帮助时,设置详细级别很有用,这将有助于您在投入生产之前删除所有这些日志。

        调试

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

        信息

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

        警告

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

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

        错误

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

        WTF(多么可怕的失败)

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

        【讨论】:

          【解决方案6】:

          Android Studio website 最近(我认为)提供了一些建议,从不同的日志级别期待什么样的消息可能对 Kurtis 的回答有用:

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

          【讨论】:

            【解决方案7】:

            我认为这些不同类型的日志记录的重点是,如果您希望您的应用程序基本上自我过滤自己的日志。所以 Verbose 可以绝对记录应用程序中所有重要的内容,然后调试级别将记录详细日志的子集,然后信息级别将记录调试日志的子集。当您进入错误日志时,您只想记录可能发生的任何类型的错误。还有一个调试级别称为 Fatal,用于在您的应用中真正引起轰动时使用。

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

            【讨论】:

              猜你喜欢
              • 2017-01-28
              • 2014-09-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多