More than 1 year has passed since last update.

前置き

NSLog を生で使うと、往々にして結局 NSLog を後で剥がすハメになります。理由は以下のようなものですね。

  • プロダクションでログを出したくない
  • パフォーマンスに影響がある
  • 沢山出てウザい
  • 他の人のログが沢山出てきてウザい etc..

対策

しかし、デバッグのために出力しておきたいログは山ほどあります。
#ifdef DEBUG で頑張っても良いですが、次のようなマクロを定義するともっと便利です。

(YOUR などは空気を読んで置換してください)

#if YOUR_DEBUG
#define YOURLog(...) NSLog(@"YOUR_APP: %@", [NSString stringWithFormat:__VA_ARGS__]);
#else
#define YOURLog(...)
#endif

これを定義することで、通常の NSLog のように使うことができ、なおかつプリプロセッサマクロで自由に取り外しが出来る NSLog が作れます。リリースビルドでは勝手に消えてくれます。

YOURLog(@"Log %@", @"it!");
YOUR_APP: Log it!

利用風景

これで沢山出力することで、例えば以下のようなログが出力されます。

687474703a2f2f692e6779617a6f2e636f6d2f35613662353764353234313061613663663831623038386635643163363731382e706e67.png

プリプロセッサマクロの設定は以下のように行います。

687474703a2f2f692e6779617a6f2e636f6d2f36343365396133623332356138306566356162353337306432373930633861312e706e67.png

Tips

  • モジュール毎に Prefix を分けると、視界に入れなくて良いモジュールのログを無効に出来て便利。
  • モジュール毎に Prefix が付いていると、どこから来たログなのか一目瞭然で便利 (重要)
  • ログレベルを使いたいなど、もっとコントロールしたい人は CocoaLumberjack を使いましょう。
  • モジュールを作る人は特に、NSLog を直接使わず、このようなマクロを使ってログを出力したい。利用者にとっては、NSLog を除去するのだけでも難儀です。

以上です。