XCodeでAndroid Studioライクなログを出力してみる

by

logcat-protip

はじめに

プログラマの小林です。
今回は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, "テスト");

これでログに色付きの文字列が出力されました。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-24-21-11-38

 

まとめ

いかがでしたでしょうか。
このように、まず開発で必要になるのはデバッグ機能です。
場合によっては高速に流れてしまうログも、
このように色が付いていれば、
「この辺で警告が出ていたな」など、当たりをつけて
デバッグできるようになります。
皆さんもどんどん、使いやすいログ機能を作ってみてください。

小林良
2014年10月にEDAで1ヶ月間インターン研修を受けた縁で
2016年4月入社。入社前は専門学校でプログラムを専攻。
好きな言語はC++、グラフィックスAPIはOpenGL。
最近はマルチスレッドのパターンを勉強中。

Egg Device Application

東京品川のスマホアプリ開発会社です。
一般アプリ、業務用アプリからVRまで開発可能。

ライター一覧

求人情報

スマホアプリ開発の
相談を受け付けています

メールでのご相談

お電話でのご相談
TEL 03-5422-7524
平日10:00~18:00