原始问题: 在iOS应用程序中,有哪些替代NSLog的日志记录模块?请先亲身体验并解释其优缺点。
附加请求1: 我尝试使用TestFlight TFLog来帮助上传日志到他们的服务器,但似乎仅限于应用程序在后台运行时需要进行日志记录的情况。一个能够帮助滚动/压缩日志文件并上传到服务器的日志系统会非常有帮助。
附加请求2: 有些人提到NSLog的另一个问题是,当您提交应用程序进行生产时,苹果不喜欢它。
谢谢。
原始问题: 在iOS应用程序中,有哪些替代NSLog的日志记录模块?请先亲身体验并解释其优缺点。
附加请求1: 我尝试使用TestFlight TFLog来帮助上传日志到他们的服务器,但似乎仅限于应用程序在后台运行时需要进行日志记录的情况。一个能够帮助滚动/压缩日志文件并上传到服务器的日志系统会非常有帮助。
附加请求2: 有些人提到NSLog的另一个问题是,当您提交应用程序进行生产时,苹果不喜欢它。
谢谢。
通常情况下,可以使用printf
系列函数来进行日志输出,这些函数通常比NSLog
更快,但不支持对象的%@
格式说明符。
最近我一直在使用优秀的Lumberjack框架进行日志输出,它是异步的,并且不会对您的代码产生性能影响。它还具有大量的自定义功能,可用于日志输出格式化。
如果你有兴趣制作自己的NSLog变体(完全替代),请看这里。
如果你不想制作自己的NSLog,而是想要定制当前NSLog可以看看这个页面上的一些技巧。
个人而言,我更喜欢从头开始重做NSLog的方法,因为它提供了更多的控制。然而,它需要更多的时间来实现,并且您必须学习关于可变参数列表及其实现的知识才能使其正常工作。当您想将va_list传递到不同的函数时,这会变得特别痛苦。制作自己版本的一个方便功能是,您可以设置函数以记录到任何您喜欢的位置(控制台或不同的日志文件) - 最终都归结为聪明的fprintf
调用。
__LINE__,__PRETTY_FUNCTION__
等)。这是更简单的方法,也许这就是您需要的全部,但它不像自己编写那样提供太多控制权。__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宏。
"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");