NSLog替代品?

时间:2012-11-05 00:23:50

标签: objective-c ios

原始问题: 对于iOS应用程序,NSLog的备用日志记录模块有哪些?请解释您亲身经历的利弊。

附加请求1: 我确实尝试使用TestFlight TFLog,这也有助于将日志上传到他们的服务器,但是当应用程序在后台运行时需要记录时似乎有限。有助于滚动/压缩日志文件和服务器上载的日志记录系统将大有帮助。

附加请求2: 有些人写的另一个问题是,当你提交生产应用程序时,Apple不喜欢它。

感谢。

5 个答案:

答案 0 :(得分:7)

总是存在printf系列函数,这些函数通常比NSLog快,但不支持对象的%@格式说明符。

最近我一直在使用优秀的Lumberjack框架进行日志记录,这是异步的,不会对代码产生性能影响。它还具有大量用于日志输出格式的自定义功能。

答案 1 :(得分:2)

如果您有兴趣制作自己的NSLog变体(完全替换),请查看here

如果您不想制作自己的NSLog,而是希望自定义当前的NSLog可以查看on this page instead概述的一些技巧。

就个人而言,我更喜欢redo-NSLog-from-scratch方法,因为它提供了更多控制。然而,它需要花费相当多的时间来实现,您必须了解变量参数列表及其实现,以使其正常工作。当你想要将va_lists传递给不同的函数时,这变得特别痛苦。制作自己版本的一个方便的功能是,您可以设置功能以记录到您喜欢的任何地方(控制台或不同的日志文件) - 这一切都会在一天结束时回到智能fprintf电话。 / p>

另一方面,如果您只是想要就地定制NSLog,那么您真正需要做的就是熟悉一些方便的编译器宏(例如__LINE__, __PRETTY_FUNCTION__等)。这是一种更简单的方法,可能就是您所追求的一切,但它并不能提供与滚动自己一样多的控制。

希望这有帮助!

答案 2 :(得分:1)

您可能已经知道,但在XCode中调试时总是可以看到变量值

看看这个 Does Xcode have a watch window?

答案 3 :(得分:1)

我知道的最佳替代方案是宏,您可以将它与任何预定义的C宏__FILE____PRETTY_FUNCTION__等一起使用。

<强>原型

#define MyLog(args...) MyLogImpl(__FILE__,__PRETTY_FUNCTION__,args);

void MyLogImpl(const char *filename, const char *funcPrettyName, NSString *formatStr, ...);

<强>实施

使用va_start() va_end(),您将能够获得格式。为了弥补printf缺少格式支持,您将使用以下值:

NSString *messageStr =  [[NSString alloc] initWithFormat:formatStr arguments:replacingArgumentParameters];

然后您就可以将标准信息与任何其他数据一起打印,例如

fprintf(stderr, "%s %s", filename, messageStr);

它不仅为您提供了消息本身,而且还为您提供了调用MYLog的文件名。

另一个有用的技巧是将消息限制为当前的log_level或运行配置。

如果你觉得自己有足够的经验,你也可以继续尝试重新定义标准的NSLog宏。

答案 4 :(得分:0)

正如“A-Live”所说,最好的选择是宏观。只需在.pch文件中定义以下MACRO即可。

#ifdef DEBUG
   #define debug(format, ...) CFShow((__bridge void *)[NSString stringWithFormat:@"%s [LINE: %d] ==>> " format,__PRETTY_FUNCTION__, __LINE__, ## __VA_ARGS__]);
#else
#endif

现在,如何使用上面的宏?

<强>示例

debug(@"Version Number is 1.0");

注意:

您可以通过编辑架构禁用所有 调试日志 。 在编辑架构下,选择第一个选项卡,即“信息

在“信息”选项卡中,将“构建配置”设置为“发布”,然后按“确定”按钮。

enter image description here