如何将参数值传递给自定义NSLOG

时间:2013-09-02 17:21:41

标签: ios objective-c

我正在为我的应用程序开发一个记录器类.NSLog将仅在调试模式下打印。我已经自定义了NSLog,其中打印了源文件的名称,源代码行号,类的名称和调用NSLog()的方法。 也就是说,我目前的NSLOG看起来像              (ClassName MethodName)(SourceFileName:LineNumber)NSLog输出

现在,我想记录methodname的参数值。如何在NSLog中获取这些参数值??? 我希望输出为          (ClassName MethodName)(SourceFileName:LineNumber)(参数值)NSLog输出

3 个答案:

答案 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