我发布应用时应该删除NSLogs吗?

11

在发布的应用程序中使用NSLog是否明智?我知道不应该在使用频繁的循环中这样做,或者记录过于详细。但我不确定这样做是否是一个好习惯。

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

5个回答

12

我认为不向用户设备日志发送垃圾信息是一种良好的做法。

为此,我有一个宏DebugLog,仅在调试版本中处于活动状态:

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

对于我在开发中感兴趣的所有日志消息,我使用DebugLog。 对于应记录的所有错误消息,我使用无条件的NSLog。 这样,发布版本不会使用户的控制台日志混乱。 只有重要的消息才会被记录。


2
没错。此外,在iOS设备上,系统日志的存在时间短得令人发指,所以在现实生活中几乎毫无用处。NSLog()在iOS上只是一个局部调试工具。 - Costique

4

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


仍然不应该在生产环境中使用NSLog来排除应用程序故障。有几种报告错误和崩溃的工具,例如NewRelic和其他许多甚至可以免费使用。 - user2387149

1

当有特定的支持团队为现场应用提供支持时,记录日志始终很重要,在这种情况下,他们可以检查发生了什么,并且如果某些事情与代码无关,则可以修复问题,如果是核心代码问题,则可以传递给开发团队。

但是,如果应用程序类似于游戏,则日志不重要。您可以在发布应用程序之前删除它们。


1

这要看情况。如果你的应用程序中没有使用崩溃报告功能,通常最好保留一些记录关键错误的NSLog语句,以便有经验的用户可以将它们反馈给你,并在发布后帮助你修复应用程序中的问题。但是,在发布版本中不建议有太多深奥的调试NSLog调用。


0
如果你只想在调试时让NSLog起作用,并且不想对代码做任何更改,最好的方法是在.pch文件中进行以下操作:
#ifndef DEBUG
#define NSLog(x...)
#endif

解释和故障排除:

这意味着如果未定义DEBUG,它将“覆盖”所有的NSLog操作,使其无效。这个字符串替换是在编译之前进行的,因此整个代码中没有一个NSLog会被遗漏,不会因为错误而在生产环境中留下NSLog,这消除了在生产应用程序上忘记删除NSLog的人为错误。

在所有Xcode项目中,默认情况下DEBUG通常在调试模式下被定义。您可以在以下位置找到是否已定义:

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

如果它不存在,就添加。
DEBUG=1

另外,如果您没有pch文件或未连接,以下是您需要执行的操作(因为在Xcode 5中已自动添加,但在新项目模板上默认情况下不再添加在Xcode 6及以上版本中)

为什么Xcode 6中不会自动创建ProjectName-Prefix.pch?


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接