簡體   English   中英

使用 Cocoa Lumberjack 日志框架立即刷新日志語句,NSLog 刷新到控制台的方式

[英]Immediately flushing log statements using the Cocoa Lumberjack logging framework, the way NSLog flushes to console

許多 iOS 開發人員發現Cocoa Lumberjack Logging 框架NSLog簡單NSLog語句所沒有的需求。 它讓人想起 Java 世界中的 Log4J。

無論如何,我已經為 Lumberjack 編寫了自己的自定義格式化程序,但是我沒有看到任何有關如何立即刷新日志語句的文檔。

例如,如果我在調試器中運行並點擊NSLog()語句,它會立即將日志語句刷新到控制台。 這就是我想從 Lumberjack 中的DDLogVerbose()調用中獲得的行為。

現在,如果我希望它們在我調試一段代碼時立即吐出,我會返回並將這些語句更改為NSLog()語句。 由於 Lumberjack 如此強大,我不得不認為有一種方法可以將其配置為無延遲刷新。

有誰知道如何做到這一點?

我在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

您可以等待日志記錄隊列超時完成:

- (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)));
}

你可以嘗試添加fflush(stderr); if (logMsg)- (void)logMessage:(DDLogMessage *)logMessage函數中 if - (void)logMessage:(DDLogMessage *)logMessage的底部。

刷新每條日志消息的缺點是您可能會遇到性能下降,但如果您將其用於調試,則可能無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM