NSLog替代方案?

3

原始问题: 在iOS应用程序中,有哪些替代NSLog的日志记录模块?请先亲身体验并解释其优缺点。

附加请求1: 我尝试使用TestFlight TFLog来帮助上传日志到他们的服务器,但似乎仅限于应用程序在后台运行时需要进行日志记录的情况。一个能够帮助滚动/压缩日志文件并上传到服务器的日志系统会非常有帮助。

附加请求2: 有些人提到NSLog的另一个问题是,当您提交应用程序进行生产时,苹果不喜欢它。

谢谢。


如果您告诉我们关于 NSLog 您希望有何不同,那将会很有帮助。 - sosborn
Sosborn,我刚刚添加了一些更多的信息,但我也希望听到一些我可能还不知道的重要功能。谢谢。 - x89a10
我看到,在问题完全编辑之后,有人在大部分回答中进行了投票降低,而没有任何评论。圣诞老人,请不要给那个人以及编辑审批者任何圣诞礼物。 - A-Live
你可以使用断点和实际调试。 - Siddharth
5个回答

8

通常情况下,可以使用printf系列函数来进行日志输出,这些函数通常比NSLog更快,但不支持对象的%@格式说明符。

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


1
这看起来非常有趣。我一定会尝试使用它。谢谢。 - x89a10
1
伐木工真的很棒。如果你想要一些不同的日志框架,可以看看https://github.com/fpillet/NSLogger。 - CRDave

3

如果你有兴趣制作自己的NSLog变体(完全替代),请看这里

如果你不想制作自己的NSLog,而是想要定制当前NSLog可以看看这个页面上的一些技巧

个人而言,我更喜欢从头开始重做NSLog的方法,因为它提供了更多的控制。然而,它需要更多的时间来实现,并且您必须学习关于可变参数列表及其实现的知识才能使其正常工作。当您想将va_list传递到不同的函数时,这会变得特别痛苦。制作自己版本的一个方便功能是,您可以设置函数以记录到任何您喜欢的位置(控制台或不同的日志文件) - 最终都归结为聪明的fprintf调用。

另一方面,如果您只想直接自定义NSLog,则实际上您只需要熟悉一些有用的编译器宏(例如__LINE__,__PRETTY_FUNCTION__等)。这是更简单的方法,也许这就是您需要的全部,但它不像自己编写那样提供太多控制权。
希望这可以帮到您!

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的文件名。

另一个有用的技巧是将消息限制在当前日志级别或运行配置中。

如果您感觉足够有经验,也可以尝试重新定义标准的NSLog宏。


1

0

"A-Live"所说的最佳替代方案是宏。只需在您的.pch文件中定义以下宏即可。

#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


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