【问题标题】:How to get rid of the date and time that appears before every NSLog statement in the console如何摆脱控制台中每个 NSLog 语句之前出现的日期和时间
【发布时间】:2009-07-01 17:23:57
【问题描述】:

我在我的应用程序中使用 NSLog。我想摆脱每个字符串的烦人开头:“2009-07-01 21:11:06.508 MyApp[1191:207]”。

有没有办法做到这一点?可能是另一个日志记录功能?

谢谢。

【问题讨论】:

    标签: iphone objective-c xcode nslog


    【解决方案1】:

    阅读这些:

    这是一个名为“QuietLog”的 Github 项目,最初来自我们的 CocoaHeads 网站,它解释了如何创建一个 QuietLog 函数来完成您所描述的工作。它还展示了如何将 QuietLog 包装到一个名为 LocationLog 的宏中,以便它打印出您获得日志语句的文件名和行号。我在所有项目中都使用它,并且不再丢失杂散的“NSLog”语句。

    【讨论】:

    • +1 Dang,我正要发布同样的内容。我写了那个wiki页面... ;-)
    • 你是从 Borkware Quickies 那里得到的,所以一切都很顺利。 ;)
    【解决方案2】:

    此预处理器宏易于实现,您无需更改任何当前的NSLog 语句:

    #define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
    

    它完全像NSLog 一样工作,在消息之前没有所有额外的东西。

    我最初是在另一个 SO question 中找到的,但现在找不到。

    【讨论】:

      【解决方案3】:

      我喜欢将 Objective-C 对象用于格式字符串和参数,因此我重新编写了 NSLog() 并将其添加到我的实用程序中。

      
      + (void)myLog:(NSString *)formatString, ...
      {
          va_list args;
          va_start(args, formatString);
          NSString* output = [[NSString alloc] initWithFormat:formatString arguments:args];
          fprintf(stderr, "%s\n", [output UTF8String]);
          [output release];
          va_end(args);
      }
      

      【讨论】:

      • 如果您阅读 Dave 链接到的链接,您会发现这就是我们所做的,除了我们还处理格式字符串中的 %% 实体。
      • Quinn,直到我发布我的答案后我才看到那个帖子。还有一些事情要说的是预先得到答案,而不必遵循外部链接。
      • 不用担心。 (SO 通常会在发布其他答案时告诉您,但重叠是很正常的。)您是对的,有时在答案中包含正确的代码会很好。然而,一旦它超过了一定的大小,或者在这种情况下,当 wiki 页面可能发生变化时(自 Dave 的帖子以来它已经发生了变化),链接可能会更好。
      • 另外,请注意,这是一种稍微不同的方法,它通过创建一个类方法(在该类上调用)而不是像 NSLog() 这样可以在任何地方使用的 C 函数。只是取决于提问者喜欢什么,以及使用范围。
      【解决方案4】:

      你试过CFShow()吗?

      【讨论】:

      • (添加到文档的链接)我不知道该功能,很高兴知道。但是,它不是直接替换,因为您必须有一个 NSString* 才能转换为 CFStringRef。尽管如此,我们仍然可以轻松定义一个宏或函数来包装 CFShow()...
      • 不幸的是,CFShow 在 Leopard 中有一些非常奇怪的行为,它错误地硬换行不可读。对于 Leopard 来说,最好完全避免使用 CFShow。
      【解决方案5】:

      您可以打印到 sdterr:

      fprintf(stderr, "%s", "Your message");
      

      编辑:查看 Karl Kraft 的 this implementation

      【讨论】:

      • 这需要(转换为)C 字符串,并且其中包含 %@ 的格式字符串不起作用。这不是一个坏主意,但直接使用它并不是 NSLog() 的直接替代品。
      • 没错,你应该用可变参数将它包装在一个函数中。我用的是 Karl Kraft karlkraft.com/index.php/2009/03/23/114
      • 我喜欢他方法中的调试开/关开关,但他也没有 %% 转义(诚然很少见,但当它们发生时会出现问题)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-30
      • 2017-03-12
      • 2020-07-05
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多