原始问题: 对于 iOS 应用程序,NSLog 的替代日志记录模块是什么?请解释您亲身经历的利弊。
附加请求 1: 我确实尝试使用 TestFlight TFLog,它也有助于将日志上传到他们的服务器,但是当应用程序在后台运行时需要记录时,它似乎受到限制。有助于滚动/压缩日志文件和服务器上传的日志系统将有很大帮助。
附加要求2: 有人写的另一个NSLog问题是Apple不喜欢在您提交应用程序进行生产时。
谢谢。
原始问题: 对于 iOS 应用程序,NSLog 的替代日志记录模块是什么?请解释您亲身经历的利弊。
附加请求 1: 我确实尝试使用 TestFlight TFLog,它也有助于将日志上传到他们的服务器,但是当应用程序在后台运行时需要记录时,它似乎受到限制。有助于滚动/压缩日志文件和服务器上传的日志系统将有很大帮助。
附加要求2: 有人写的另一个NSLog问题是Apple不喜欢在您提交应用程序进行生产时。
谢谢。
总是有printf
函数族,它们通常比 快NSLog
,但不支持%@
对象的格式说明符。
最近我一直在使用优秀的Lumberjack框架进行日志记录,它是异步的,不会对您的代码产生性能影响。它还具有大量用于日志输出格式的自定义功能。
如果您有兴趣制作自己的 NSLog 变体(完全替代),请查看此处。
如果您不想制作自己的 NSLog 而是想自定义当前的 NSLog 可以看看这个页面上列出的一些技巧。
就个人而言,我更喜欢 redo-NSLog-from-scratch 方法,因为它提供了更多的控制。然而,它确实需要更多的时间来实现,并且您必须了解变量参数列表及其实现才能使其正常工作。当您想将 va_lists 传递给不同的函数时,这变得特别痛苦。制作自己的版本的一个方便的功能是,您可以设置功能以记录到您喜欢的任何地方(控制台或不同的日志文件) - 这一切都fprintf
在一天结束时回到智能调用。
另一方面,如果您只想就地自定义 NSLog,那么您真正需要做的就是熟悉一些方便的编译器宏(例如__LINE__, __PRETTY_FUNCTION__
,等)。这是更简单的方法,可能就是您所追求的,但它提供的控制不如您自己的控制。
希望这可以帮助!
你可能已经知道了,但是在 XCode 中调试时你总是可以观察变量值
看看这个 Xcode 有监视窗口吗?
我知道的最好的选择是宏,您可以将它与任何预定义的 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 文件中定义以下宏。
#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");
笔记:
您可以通过编辑架构来禁用所有调试日志。在编辑架构下选择第一个选项卡,即“信息”
在“信息”选项卡中,将构建配置设置为“发布”,然后按“确定”按钮。