アプリ開発日誌
2016.10.25
XCodeでAndroid Studioライクなログを出力してみる
はじめに
プログラマの小林です。
今回はXCodeでAndroid Studioライクなログを
出力する方法について簡単に説明したいと思います。
先日、iOS向けのC++案件がありました。
デバッグ環境を整備していたのですが、
XCodeにはデフォルトではAndroidStudioのような
InfoやDebugなどのログ出力、色分けがありませんでした。
そこで、AndroidのLogクラスのようにログを出力できる
処理を書きました。
今回の実行環境は
・Mac OS X 10.11
・XCode 7
となっています。
XCodeColors
今回、ログに色をつけるためにプラグインを導入しました。
XCodeColorsというプラグインです。
これを導入すると、指定の書式でログに色をつけられるようになります。
導入方法は上記ページ内の「XcodeColors installation instructions for Xcode 4, 5, 6 & 7」
の項目に書いてあります。
Objective-C側
まずはObjective-C側のコードを見ていきます。
ヘッダーファイル(Log-ios.h)
#ifndef Log_ios_h #define Log_ios_h #import <Foundation/Foundation.h> #define XCODE_COLORS_ESCAPE_MAC @"\033[" #define XCODE_COLORS_ESCAPE XCODE_COLORS_ESCAPE_MAC #define XCODE_COLORS_RESET_FG XCODE_COLORS_ESCAPE @"fg;" // Clear any foreground color #define XCODE_COLORS_RESET_BG XCODE_COLORS_ESCAPE @"bg;" // Clear any background color #define XCODE_COLORS_RESET XCODE_COLORS_ESCAPE @";" // Clear any foreground or background color #define XCODE_COLORS_VERBOSE XCODE_COLORS_ESCAPE @"fg224,224,224;" #define XCODE_COLORS_DEBUG XCODE_COLORS_ESCAPE @"fg0,224,0;" #define XCODE_COLORS_INFO XCODE_COLORS_ESCAPE @"fg0,224,224;" #define XCODE_COLORS_WARNING XCODE_COLORS_ESCAPE @"fg224,224,0;" #define XCODE_COLORS_ERROR XCODE_COLORS_ESCAPE @"fg224,0,0;" @interface Log_ios : NSObject { // no member } + (void) LogV:(const char*) expr; + (void) LogD:(const char*) expr; + (void) LogI:(const char*) expr; + (void) LogW:(const char*) expr; + (void) LogE:(const char*) expr; @end #endif /* Log_ios_h */
上側のマクロはXCodeColorsを使用するためのマクロです。
例えば、Debugのログの色は
#define XCODE_COLORS_DEBUG XCODE_COLORS_ESCAPE @”fg0,224,0;”
この部分になります。後ろの”fg0,224,0″の部分を変更して、
好みの色に変えることができます。
ちなみに各数字は左から
0 = 赤(Red)
224 = 緑(Green)
0 = 青(Blue)
の色成分になっています。
次に、実装側のコードを見てみましょう。
今回はLogD(Debug)の実装のみ書きます。
その他の実装はLogD固有の部分を置き換えてください。
実装ファイル(Log-ios.mm)
#import "Log-ios.h" + (void) LogD:(const char*) expr { NSString* log = [[NSString alloc] initWithUTF8String:expr]; NSLog(XCODE_COLORS_DEBUG @"D:%@" XCODE_COLORS_RESET, log); [log release]; }
出力前に、C++側から呼び出した文字列をUTF8文字列に変換します。
そのあとにNSLogでコンソールにログを出力します。
これで、プラグインを導入できていれば、色がついた文字を
出力できるようになっているはずです。
C++側
呼び出し用のログクラスを作成します。
ヘッダーファイル(Log-bridge.h)
#ifndef Log_bridge_h #define Log_bridge_h class Log { public: static void v(const char* expr, ...); static void d(const char* expr, ...); static void i(const char* expr, ...); static void w(const char* expr, ...); static void e(const char* expr, ...); private: static const int MAX_LENGTH = 2048; static char OUTPUT_LOG[MAX_LENGTH]; }; #endif /* Log_bridge_h */
可変長引数を取るログ出力のブリッジクラスです。
次に実装ファイルを見ていきます。
今回はd(Debug)メソッドを見ていきます。
実装ファイル(Log-bridge.mm)
#import "Log-bridge.h" #import "Log-ios.h" void Log::d(const char* expr, ...) { va_list args; va_start(args, expr); memset(OUTPUT_LOG, 0, MAX_LENGTH); vsprintf(OUTPUT_LOG, expr, args); [Log_ios LogD:OUTPUT_LOG]; va_end(args); }
引数の文字列を、クラス変数に保存し、
先ほど作成したLog_iosクラスを呼び出します。
コード側からの呼び出しは以下のようになります。
Log::v("%d %s", 1, "テスト"); Log::i("%ld %c", INT_MAX + 1, 'I'); Log::w("%.2f %s", 1.2345f, "テスト");
これでログに色付きの文字列が出力されました。
まとめ
いかがでしたでしょうか。
このように、まず開発で必要になるのはデバッグ機能です。
場合によっては高速に流れてしまうログも、
このように色が付いていれば、
「この辺で警告が出ていたな」など、当たりをつけて
デバッグできるようになります。
皆さんもどんどん、使いやすいログ機能を作ってみてください。