我正在为我的应用程序开发一个记录器类.NSLog将仅在调试模式下打印。我已经自定义了NSLog,其中打印了源文件的名称,源代码行号,类的名称和调用NSLog()的方法。 也就是说,我目前的NSLOG看起来像 (ClassName MethodName)(SourceFileName:LineNumber)NSLog输出
现在,我想记录methodname的参数值。如何在NSLog中获取这些参数值??? 我希望输出为 (ClassName MethodName)(SourceFileName:LineNumber)(参数值)NSLog输出
答案 0 :(得分:3)
这样的事情应该有效
#define InstanceLog(fmt, ...) NSLog(@"(%@.%@)(%s:%d) " fmt, NSStringFromClass(self.class), NSStringFromSelector(_cmd), __FILE__, __LINE__, ##__VA_ARGS__)
您可以在Objective-C方法中将其用作NSLog
InstanceLog(@"simple string");
InstanceLog(@"%@ %@", @"hello", @"world");
答案 1 :(得分:2)
没有办法自动内省传递给方法的值。即使在DEBUG构建中(优化器不在其中),任何编写代码的尝试都表示iVars会非常复杂(你必须深入到符号表,提取偏移等,然后尝试并找到可能在试图抓住它们时被破坏的论据。)
所以,不,没有办法真正实现自动化。
但是,一般而言,任何此类日志记录机制都会产生如此巨大的输出量,您最好创建(可能只调试)日志记录,这些日志记录既可以配置,又可以高度调整到您的应用程序。
你可以传递这样的args(感谢@hoha更简单的版本)。
#import <Foundation/Foundation.h>
#define FooLog(fmt, ...) NSLog(@"(%s): %@", __PRETTY_FUNCTION__, ## __VA_ARGS__)
@interface Bob:NSObject
@end
@implementation Bob
- (void)yourUncle
{
FooLog(@"%@", self);
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
NSString *w = @"World";
FooLog(@"Hello, %@!", w);
[[Bob new] yourUncle];
}
}
输出:
2013-09-02 10:51:49.447 Untitled[60967:507] (int main(int, char **)): Hello, World!
2013-09-02 10:51:49.453 Untitled[60967:507] (-[Bob yourUncle]): <Bob: 0x7fde8840a490>
答案 2 :(得分:0)
对于句柄自定义日志,您可以使用或参考以下链接。
您可以根据需要自定义伐木工人。
Lumberjack error logging for ios
Lumberjack error logging tutorial