2012-01-01 11 views
14

多くのiOS開発者は、NSLogステートメントでは不要なニーズを満たすためにCocoa Lumberjack Logging frameworkを見つけました。 Javaの世界ではLog4Jを連想させる。ただちに、Cocoa Lumberjackロギングフレームワークを使用してログステートメントをフラッシュする方法、NSLogがコンソールにフラッシュする方法

Lumberjack用の独自のカスタムフォーマッタを作成しましたが、私にはわかりませんが、ログ文をすぐにフラッシュする方法に関するドキュメントはありません。

例えば、デバッガを歩いていて、NSLog()ステートメントをヒットした場合、すぐにログステートメントがコンソールにフラッシュされます。それは、LumberjackのDDLogVerbose()コールから取得したい動作です。

すぐに、コードの一部をデバッグしているうちに、これらのステートメントをすぐに吐き出させたい場合は、これらのステートメントをNSLog()ステートメントに変更します。 Lumberjackが非常に頑丈なので、遅れなくフラッシュするように設定する方法があると思う必要があります。

誰でも知っている人なら誰でも知っていますか?

答えて

27

私はDDLog.hファイルの答えを見つけました。 Lumberjackには、非同期ロギングと同期ロギングという概念があります。最初の読書では、これが何のために私をヒットしなかった。

基本的には、ログ・ステートメントを順番に出力したい場合は、同期をとる必要があります(ただし、Mikeが述べたように、パフォーマンスが低下します)。したがって、これはデバッグの状況でのみ行う必要があります。理想的には、私は別のヘッダーを一緒に入れて、そして/または他のプリプロセッサマクロを入れて、スイッチを同期させたままにしないようにします。ここで

は、あなたが何をすべきかです:

  1. #define LOG_ASYNC_ENABLED YESとラインにDDLog.h
  2. Go]を開きます。これを1つの場所でNOに変更して、ボード全体にわたる同期ロギングを行うことも、個々のレベルを変更することもできます。

ヘッダーは、DDLog.hファイル自体の変更を避けることに注意してください。したがって、Lumberjack wikiページlinkの指示に従って、別のヘッダーファイルを使用してこれらのオーバーライドのカスタマイズを明示する方法を説明します。

#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 
0

DDTTYLogger.mの- (void)logMessage:(DDLogMessage *)logMessage機能のif (logMsg)の末尾にfflush(stderr);を追加してみることもできます。

すべてのログメッセージでのフラッシングの欠点は、パフォーマンスにヒットする可能性があることです。デバッグに使用していると、おそらく問題ではないでしょう。

+0

ありがとうございました。これは賢明な仮定だった。残念ながら、それは動作しませんでした。私もstdoutをフラッシュしようとしましたが、どちらもうまくいきませんでした(これは意味があります - 全メソッドがstderrに出力を積み上げているようです)。 – idStar

1

あなたが終了するロギングキューを待つことができます:ここで私は私のアプリのプリコンパイル済みヘッダーにインポートする「MyAppLumberjack.h」ヘッダファイルとして、私が正常に書かれており、テストしたものだ、という使い方

タイムアウト:

- (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))); 
} 
関連する問題