不同的LogCat方法是:

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


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

评论

还请记住使用自定义日志。在针对特定方案时,它们真的很有用。

#1 楼

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


Log.e:这是在发生不良情况时使用的。在catch语句之类的地方使用此标记。您知道发生了一个错误,因此正在记录错误。
Log.w:当您怀疑发生了一些阴暗的情况时,请使用它。您可能并未完全处于错误模式,但是也许您已从某些意外行为中恢复过来。基本上,使用它来记录您料想不到的事情,但不一定是错误。有点像“嘿,这件事发生了,很奇怪,我们应该调查一下。”
Log.i:使用它可以将有用的信息发布到日志中。例如:您已成功连接到服务器。基本上使用它来报告成功。
Log.d:将此用于调试目的。如果要打印出一堆消息以便记录程序的确切流程,请使用此程序。如果要保留变量值的日志,请使用此日志。
Log.v:如果您想在日志记录方面做到万无一失,请使用此日志。如果由于某种原因您决定将所有小事情记录在应用程序的特定部分中,请使用Log.v标签。

作为奖励......



Log.wtf:当出现绝对,可怕,神圣的错误时,请使用此选项。您知道那些捕获错误的捕获块,这些错误永远都不会发生...是的,如果您想使用Log.wtf

记录它们,

评论


你好朋友!我终于发现自己在Google从事一些Android工作。我在尝试弄清楚如何记录日志时遇到了这个问题。 :)

–神秘主义者
2014年4月29日在21:01

我不相信Log.wtf我什至检查了几次并大声笑了..我认为,所有API内都应该有这样的东西

– MBH
16-2-5在7:35

我建议将Log.v与Log.i结合使用。使用Log.i报告成功的连接,然后使用Log.v提供有关该连接的更多详细信息。

– Toby 1 Kenobi
16年5月25日在4:19

wtf代表“多么可怕的失败”

–阿布舍克
16年6月8日在4:34

谁命名这些方法?那是一个可怕的主意。我不知道我的团队如果只用1个字母名称来命名我的东西,该怎么办?打赌他们会让我下地狱?

– SandRock
19年6月13日在17:57

#2 楼

不同的方法表示优先级。正如您列出的一样,它们从最小到最重要。我认为您如何具体将它们映射为代码中的调试日志取决于您正在使用的组件或应用,以及Android如何以不同的构建方式(英语,用户调试和用户)对待它们。我在Android的本机守护程序中做了很多工作,这就是我的工作方式。它可能不适用于您的应用程序,但可能有一些共同点。如果我的解释含糊不清,那是因为其中有些是艺术而不是科学。我的基本原则是尽可能高效,确保您可以合理地调试组件而不会影响系统性能,并始终检查错误并记录错误。

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


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 楼

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

从详细到最小的顺序是ERROR,WARN,INFO,DEBUG,VERBOSE。除非在开发期间,否则切勿将Verbose编译到应用程序中。调试日志在其中编译,但在运行时剥离。错误,警告和信息日志将始终保留。


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

#4 楼

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


#5 楼

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

因此,我将在博客文章“ Android Log Levels”中写的内容带到这里。
/>
详细信息

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

Debug

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

信息

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

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

错误

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

WTF(多么严重的失败)

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

#6 楼

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

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

#7 楼

Android Studio网站最近(我认为)提供了一些建议,建议从不同的日志级别期望什么样的消息,这些消息可能与Kurtis的答案一起使用:



详细-显示所有日志消息(默认)。

调试-显示仅在开发期间有用的调试日志消息,以及此列表中较低的消息级别。

信息-显示常规使用的预期日志消息,以及此列表中较低的消息级别。

警告-显示尚未出错的可能问题以及此列表中较低的消息级别。

错误-显示导致错误的问题以及此列表中较低的消息级别。

声明-显示开发人员期望永远不会发生的问题。