14

多くのiOS開発者は、Cocoa Lumberjack Loggingフレームワークが、単純なNSLogステートメントでは満たされないニーズを満たすことを発見しました。これは、Javaの世界でのLog4Jを彷彿とさせます。

いずれにせよ、私はLumberjack用に独自のカスタムフォーマッターを作成しましたが、ログステートメントをすぐにフラッシュする方法に関するドキュメントが表示されません。

たとえば、デバッガーをウォークスルーしているときにNSLog()ステートメントをヒットすると、ログステートメントがすぐにコンソールにフラッシュされます。DDLogVerbose()これが、Lumberjackでの呼び出しから取得したい動作です。

今のところ、NSLog()コードのセグメントをデバッグしているときにすぐに吐き出したい場合は、これらのステートメントをステートメントに変更します。Lumberjackは非常に堅牢であるため、遅滞なくフラッシュするように構成する方法があると思いました。

誰もがそうする方法を知っていますか?

4

3 に答える 3

28

DDLog.hファイルに答えが見つかりました。Lumberjackには、非同期および同期ロギングの概念があります。最初に読んだとき、これが何のためにあるのかについては私にはわかりませんでした。

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

これがあなたがすることです:

  1. 開くDDLog.h
  2. の行に移動し#define LOG_ASYNC_ENABLED YESます。これをNO1つの場所に変更して、全面的な同期ロギングを行うか、次の行で個々のレベルを変更することができます。

ヘッダーは、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 に答える