发布我的应用程序时我应该删除 NSLogs

Posted

技术标签:

【中文标题】发布我的应用程序时我应该删除 NSLogs【英文标题】:Should I remove NSLogs when releasing my App 【发布时间】:2012-01-21 20:13:39 【问题描述】:

建议在运输应用程序中使用NSLogging 吗?我知道我不应该在大量使用的循环中。或者不要太冗长地记录。但我不确定这样做是否是一个好习惯。

在发布之前删除所有 NSLogs 似乎也不是一个好习惯。

【问题讨论】:

【参考方案1】:

我认为不要向用户的设备日志发送垃圾邮件是一个好习惯。

为此,我有一个宏 DebugLog,它只对调试版本有效:

#ifdef DEBUG
#define DebugLog(fmt, ...) NSLog(fmt, __VA_ARGS__)
#else
#define DebugLog(fmt, ...)
#endif

对于我对开发感兴趣的所有日志消息,我使用DebugLog。对于应该记录的所有错误消息,我使用无条件的NSLog。通过这种方式,分发版本不会弄乱用户的控制台日志。仅记录重要消息。

【讨论】:

没错。此外,ios 设备上的系统日志非常短暂,所以在现实生活中它只是无用的。 iOS 中的NSLog() 只是一个本地 调试工具。【参考方案2】:

这是编码哲学问题之一,但在我的生产应用程序中,我使用asl 并将其配置为默认关闭,但保留选项(通过Info.plist 中的条目)以启用各种级别的日志记录.我倾向于同意您的观点,即配送应用中的NSLogs 太多看起来很糟糕。

【讨论】:

仍然 NSLog 不应该是解决生产中应用程序问题的方法。有多种报告错误和崩溃的工具,例如 NewRelic 和其他一些甚至可以免费使用的工具。【参考方案3】:

当有特定的支持团队来支持实时应用程序时,日志记录总是很重要的,在这种情况下,他们可以检查发生了什么,如果某些事情与代码无关并且是核心代码问题,他们可以解决问题然后他们可以传递给开发团队。

但如果应用程序类似于 Game ,则日志无关紧要。您可以在发布应用程序之前删除它们。

【讨论】:

【参考方案4】:

这取决于。如果您没有在应用程序中使用崩溃报告工具,通常最好保留一些记录严重错误的 NSLog 语句,以便知识渊博的用户可以将它们报告给您并帮助您解决应用程序的问题释放。在您的版本中包含太多深奥的调试NSLog 调用绝对不是一个好主意。

【讨论】:

【参考方案5】:

如果您希望 NSLog 仅在调试时工作,并且您不想对代码进行任何更改,最好的方法是在 .pch 文件上执行此操作: p>

#ifndef DEBUG
#define NSLog(x...)
#endif

解释和故障排除:

这意味着如果未定义 DEBUG 它将“覆盖”所有 NSLog 以不执行任何操作,此字符串替换发生在编译之前,因此整个代码中没有 NSLog 会逃逸,不会错误地将 NSLog 留在生产中,这消除了忘记删除生产应用程序上的 NSLog 的人为错误。

DEBUG 通常在所有 Xcode 项目中默认定义为调试模式。你可以看看它是否定义在:

Build Settings -> 
Apple LLV #.# - Preprocessing -> 
Preprocessor Macros -> Debug

如果不存在则添加

DEBUG=1

如果你没有 pch 文件或没有连接,这就是你要做的(因为它是在 xcode 5 中自动添加的,但在 xcode 6 和新项目模板中默认不再添加) )

Why isn't ProjectName-Prefix.pch created automatically in Xcode 6?

【讨论】:

这在与其他开发人员合作时是完美的,因为通常每个人都使用 NSLog,如果您想定义另一个宏,例如“DebugLog()”,开发人员可能会忘记使用它,因此发布带有日志的应用程序打印出来。这消除了人为错误。

以上是关于发布我的应用程序时我应该删除 NSLogs的主要内容,如果未能解决你的问题,请参考以下文章

如何查看动态框架中使用的 NSLogs 打印的日志?

为啥当我在 Flutter for Web 中更新实时数据库中的某个字段时我的数据被删除

使用 addView() 时我的应用程序崩溃

使用 GCM ios 9 时我应该在哪里处理推送通知

Android:离线时我的应用程序不断崩溃

为啥在 PyQt5 中打开新窗口时我的应用程序会关闭?