スタッフブログ

STAFF BLOG

アプリ開発日誌

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, "テスト");

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

%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

 

まとめ

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

BACK

お問合せ

イーディーエーに興味をお持ちいただいて
ありがとうございます!
スマホアプリに関するご相談、
お見積りや弊社へのご質問など、
お気軽にお問い合わせください。
担当者より折り返しご連絡させていただきます。

    お名前必須
    会社名
    メールアドレス必須
    電話番号必須
    お問合わせ種別必須
    お問合わせ内容必須

    アンケートにご協力ください。
    弊社サイトへはどのようにしてアクセスされましたか?

    個人情報のお取扱いに関する同意事項

    1.事業者の氏名又は名称

    株式会社イーディーエー

    2.個人情報保護管理者の氏名又は職名、所属及び連絡先

    個人情報保護管理者 小宮 保人
    Mail:[email protected]

    3.取得した個人情報の利用目的

    当フォームで取得した個人情報は、お問い合わせに関する回答のために利用し、目的外利用はいたしません。

    4.弊社が取得した個人情報の第三者への委託、提供について

    弊社は、ご本人に関する情報をご本人の同意なしに第三者に委託または提供することはありません。

    5.個人情報保護のための安全管理

    弊社は、ご本人の個人情報を保護するための規程類を定め、従業者全員に周知・徹底と啓発・教育を図るとともに、その遵守状況の監査を定期的に実施いたします。
    また、ご本人の個人情報を保護するために必要な安全管理措置の維持・向上に努めてまいります。

    6.個人情報の開示・訂正・利用停止等の手続

    ご本人が、弊社が保有するご自身の個人情報の、利用目的の通知、開示、内容の訂正、追加又は削除、利用の停止、消去及び第三者への提供の停止を求める場合には、下記に連絡を頂くことで、対応致します。

    株式会社イーディーエー 個人情報お問合せ窓口
    〒106-0032 東京都港区六本木7丁目14番23 ラウンドクロス六本木4F
    TEL:03-5422-7524 FAX:03-5422-7534
    Mail:[email protected]

    7.ご提供いただく情報の任意性

    個人情報のご提供は任意ですが、同意を頂けない場合には、第3項にあります利用目的が達成できない事をご了承いただくこととなります。

    8.弊社Webサイトの運営について

    弊社サイトでは、ご本人が弊社Webサイトを再度訪問されたときなどに、より便利に閲覧して頂けるよう「クッキー(Cookie)」という技術を使用することがあります。これは、ご本人のコンピュータが弊社Webサイトのどのページに訪れたかを記録しますが、ご本人が弊社Webサイトにおいてご自身の個人情報を入力されない限りご本人ご自身を特定、識別することはできません。
    クッキーの使用を希望されない場合は、ご本人のブラウザの設定を変更することにより、クッキーの使用を拒否することができます。その場合、一部または全部のサービスがご利用できなくなることがあります。