2

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

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

4

3 回答 3

3

像这样的东西应该工作

#define InstanceLog(fmt, ...) NSLog(@"(%@.%@)(%s:%d) " fmt, NSStringFromClass(self.class), NSStringFromSelector(_cmd), __FILE__, __LINE__, ##__VA_ARGS__)

您可以NSLog在 Objective-C 方法中使用它

InstanceLog(@"simple string");
InstanceLog(@"%@ %@", @"hello", @"world");
于 2013-09-02T17:41:33.963 回答
2

没有办法自动内省传递给方法的值。即使在 DEBUG 构建中(优化器不碍事),任何编写代码自省的尝试都说 iVar 将非常复杂(您必须深入研究符号表,提取偏移量等,然后尝试并找到可能在试图抓住它们时被破坏的论点)。

所以,不,没有办法真正自动化。

不过,一般来说,任何这样的日志记录机制都会产生如此巨大的输出量,因此您最好创建(可能仅调试)既可配置又可高度调整到您的应用程序的日志记录。


您可以像这样传递参数(感谢@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>
于 2013-09-02T17:52:20.683 回答
0


对于处理自定义日志记录,您可以使用或参考以下链接。
您可以根据需要自定义 Lumberjack。

用于 ios 的
Lumberjack 错误日志记录 Lumberjack 错误日志记录教程

于 2013-09-02T17:31:40.987 回答