14

许多 iOS 开发人员发现Cocoa Lumberjack Logging 框架可以满足简单NSLog语句无法满足的需求。这让人想起 Java 世界中的 Log4J。

无论如何,我已经为 Lumberjack 编写了自己的自定义格式化程序,但我没有看到任何关于如何立即刷新日志语句的文档。

例如,如果我正在浏览调试器并点击了一条NSLog()语句,它会立即将日志语句刷新到控制台。这就是我想从DDLogVerbose()伐木工人的电话中得到的行为。

现在,NSLog()如果我希望它们在调试一段代码时立即吐出,我会返回并将这些语句更改为语句。由于 Lumberjack 如此强大,我不得不认为有一种方法可以将其配置为无延迟地刷新。

任何人都知道如何做到这一点?

4

3 回答 3

28

DDLog.h我在文件中找到了答案。Lumberjack 具有异步和同步日志记录的概念。在最初的阅读中,我并没有意识到这是为了什么。

基本上,如果您希望日志语句按顺序输出,则需要使其同步(尽管正如 Mike 所说,这会降低性能)。因此,这只能在调试情况下进行。理想情况下,我会将另一个标头和/或其他一些预处理器宏放在一起,以确保我不会让开关处于同步状态。

这是你要做的:

  1. 打开DDLog.h
  2. 转到与 的行#define LOG_ASYNC_ENABLED YES。您可以将其更改为NO在一个位置进行全面同步日志记录,或者您可以在以下几行中更改各个级别。

请注意,标头不鼓励更改 DDLog.h 文件本身。因此,按照 Lumberjack wiki 页面链接上的说明,他们解释了如何使用不同的头文件来表达这些覆盖自定义。

使用它,这是我成功编写和测试的内容,作为我在应用程序的预编译头文件中导入的“MyAppLumberjack.h”头文件:

#import "DDLog.h"
#import "DDASLLogger.h"
#import "DDTTYLogger.h"

// ========================= Overrides ========================================
// --> per https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels
// ----------------------------------------------------------------------------

// Are we in an optimized (i.e. Release) build?
#ifdef __OPTIMIZE__
    // YES: Nothing to do from the default. (You could simplify this by using #ifndef above instead)
#else
    // NO: We're in a Debug build. As such, let's configure logging to flush right away.
    // Undefine the asynchronous defaults:
    #undef LOG_ASYNC_VERBOSE
    #undef LOG_ASYNC_INFO
    #undef LOG_ASYNC_WARN

    // Define the logs levels to be synchronous:
    #define LOG_ASYNC_VERBOSE   (NO && LOG_ASYNC_ENABLED)   // Debug logging will be synchronous
    #define LOG_ASYNC_INFO      (NO && LOG_ASYNC_ENABLED)   // Info logging will be synchronous
    #define LOG_ASYNC_WARN      (NO && LOG_ASYNC_ENABLED)   // Warn logging will be synchronous
#endif
于 2012-01-01T04:30:00.407 回答
1

您可以等待日志队列超时完成:

- (void)waitForLog {
  dispatch_semaphore_t sema = dispatch_semaphore_create(0);
  dispatch_async(DDLog.loggingQueue, ^{
    dispatch_semaphore_signal(sema);
  });
  dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)));
}
于 2016-01-29T01:26:30.763 回答
0

您可以尝试在DDTTYLogger.m 函数fflush(stderr);的底部添加。if (logMsg)- (void)logMessage:(DDLogMessage *)logMessage

刷新每条日志消息的缺点是您可能会遇到性能下降,但如果您使用它进行调试,它可能并不重要。

于 2012-01-01T02:01:19.887 回答