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

Posted

技术标签:

【中文标题】如何将参数值传递给自定义 NSLOG【英文标题】:How to pass parameter values to the custom NSLOG 【发布时间】:2013-09-02 17:21:41 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

这样的东西应该可以工作

#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");

【讨论】:

那不行; fmt 将被插入到结果字符串中,而实际上并没有使用 VA_ARGS 进行格式化。你需要一个额外的 [NSString stringWIthFormat:] 。 @bbum 谢谢。得到错误的宏标记:它应该是##,而不是__VA_ARGS__之前的# 那也行不通。您必须单独评估 fmt + VA_ARGS 我编写并使用了几十个这样的宏,它们的工作方式与它们应该的一样。要么你知道一些极端情况会破坏这个,要么你实际上并没有尝试替换它。 我很惊讶特定的 C-ism 与 Objective-C 配合得如此完美。这当然不是我最后一次尝试,但那可能是十多年前的事了。谢谢!【参考方案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>

【讨论】:

【参考方案3】:

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

Lumberjack error logging for ios Lumberjack error logging tutorial

【讨论】:

Lumberjack 日志框架是第三方框架吧???我不想使用任何第三方框架 是的,但是 Lumberjack 是用于日志记录的开源库,您可以在自己的程序中使用其中的代码。 否则,您可以点击此链接进行自定义日志记录 link here 谢谢.. 我不知道我的应用程序是否接受开源库。我已在该链接中指定,但我想记录我在问题前面提到的参数值。

以上是关于如何将参数值传递给自定义 NSLOG的主要内容,如果未能解决你的问题,请参考以下文章

XSLT:如何将节点值传递给自定义 xsl:function ?

如何将 googleMapController 传递给自定义小部件? (扑)

Spring Batch:如何将 jobParameters 传递给自定义 bean?

在Delphi中如何使用SQL自定义函数,参数怎样传递给自定义函数?

springbatch 给自定义的processor传递JobParameters中设置的参数

如何将 UIViewController 实例传递给自定义 UITableCell