原始问题: 什么是iOS应用程序的NSLog的替代日志记录模块?请解释你亲身体验过的优点和缺点。NSLog替代品?
附加要求1: 我曾尝试使用TestFlight TFLog这也与日志上传到其服务器帮助,但它似乎当你需要时,应用程序在后台运行的记录被限制。有助于滚动/压缩日志文件和服务器上传的日志记录系统将大有帮助。
附加请求2: 有些人写的另一个NSLog的问题是Apple提交应用程序生产时不喜欢它。
谢谢。
原始问题: 什么是iOS应用程序的NSLog的替代日志记录模块?请解释你亲身体验过的优点和缺点。NSLog替代品?
附加要求1: 我曾尝试使用TestFlight TFLog这也与日志上传到其服务器帮助,但它似乎当你需要时,应用程序在后台运行的记录被限制。有助于滚动/压缩日志文件和服务器上传的日志记录系统将大有帮助。
附加请求2: 有些人写的另一个NSLog的问题是Apple提交应用程序生产时不喜欢它。
谢谢。
总是有printf
系列函数,它们通常比NSLog
快,但不支持对象的%@
格式说明符。
最近我一直在使用优秀的Lumberjack框架进行日志记录,这是异步的,不会对代码产生性能影响。它还具有大量用于日志输出格式的自定义功能。
你可能已经知道,但你总是可以观察变量值的XCode调试
检查时,请出这个 Does Xcode have a watch window?
如果您有兴趣制作自己的NSLog变种(完全替换) ,看看here。
如果您不想制作自己的NSLog,但宁愿自定义当前的NSLog可以查看一下on this page instead列出的一些技巧。
就我个人而言,我更喜欢redo-NSLog从头开始的方法,因为它提供了更多的控制。然而,它需要花费相当多的时间来实现,并且您必须了解可变参数列表及其实现以使其正确工作。当你想将va_lists传递给不同的函数时,这会变得特别痛苦。制作自己版本的一个便利功能是,您可以设置功能以登录到任何你喜欢的地方(控制台或不同的日志文件) - 这一切都会在一天结束时回到智能fprintf
调用。另一方面,如果你只是想自定义NSLog,那么你真正需要做的就是熟悉一些方便的编译器宏(如__LINE__, __PRETTY_FUNCTION__
等)。这是更简单的方法,可能只是你所追求的一切,但它并不像控制你自己的那样提供更多的控制。
希望这会有所帮助!
我知道的最好的选择是宏,你可以使用它与任何预定义的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宏。
正如“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");
注:
您可以通过编辑模式禁用所有调试日志。 在编辑模式中选择第一个选项卡,即“信息”
在“信息”选项卡设置构建配置为“释放”,然后按“确定”按钮。
如果你告诉我们你想约的NSLog不同的会是什么帮助。 – sosborn
Sosborn,我只是添加了一些更多的信息,但我也在跳来听说我可能还没有意识到的一些重要功能。谢谢。 – x89a10
我看到,在问题被完全编辑之后,有人通过大多数回答向下投票,而没有任何评论。圣诞老人,请向该人士发送圣诞礼物,以及编辑批准人。 –