Xcodeのコンソール出力に色をつけて見やすくしよう〜XcodeColorsとCocoaLumberjack〜

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

NSLogでコンソールにログを出力してデバッグすることは良くあることだと思います。でもその出力が大量になるとすごく見づらいですよね。というわけで今回はコンソールに出力されるログに色をつけて見やすくしよう!的なことを書きたいと思います。

ios-console_1

XcodeのプラグインXcodeColors

実は標準だとXcodeのコンソールに出力されるログに色をつけるのが結構難しいらしいです(やったことないですが)。そこで登場するのがXcodeColorsです。XcodeColorsはXcodeのプラグインで、インストールするだけで簡単にログに色を付けることができます!

XcodeColorsのインストール

まずは以下のURLからXcodeColors.xcplugin.zipをダウンロードします。
Downloads · robbiehanson/XcodeColors

XcodeColors.xcplugin.zipを解凍したら、解凍してできたXcodeColors.xcpluginフォルダを「~/Library/Application Support/Developer/Shared/Xcode/Plug-insディレクトリ」以下に配置します。(Plug-insディレクトリがない場合は、自分で作成しましょう!)

これでインストール完了です。インストールが完了したらXcodeを起動してみましょう。既にXcodeを起動している場合は一度終了して再起動しましょう。

ログ出力に色をつけてみる

では早速色をつけてみましょう!robbiehanson/XcodeColorsのREADMEを参考に実装してみます。

適当にプロジェクトを作成し、ViewController.mを以下のように変更しましょう。

#import "ViewController.h"

#define XCODE_COLORS_ESCAPE @"\033["

#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

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(XCODE_COLORS_ESCAPE @"fg0,0,255;" @"Blue text" XCODE_COLORS_RESET);
    
    NSLog(XCODE_COLORS_ESCAPE @"bg220,0,0;" @"Red background" XCODE_COLORS_RESET);
    
    NSLog(XCODE_COLORS_ESCAPE @"fg0,0,255;"
          XCODE_COLORS_ESCAPE @"bg220,0,0;"
          @"Blue text on red background"
          XCODE_COLORS_RESET);
    
    NSLog(XCODE_COLORS_ESCAPE @"bg209,57,168;" @"You can supply your own RGB values!" XCODE_COLORS_RESET);
}

@end

実行してみると、以下のように出力されるかと思います。

ios-console_2

ちゃんと色付けされてますね〜。でもNSLogの書き方を見ると、毎回このように記述しなければならないのは非常に面倒ですね。なので、マクロを定義して簡単に使えるようにしてみましょう!

XcodeColorsを使用したNSLogのマクロを定義する

作成したプロジェクトにあるXxx-Prefix.pchにマクロを定義して簡単に使えるようにしてみましょう。Xxx-Prefix.pchを以下のように変更しましょう。

Xxx-Prefix.pch
#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

#define XCODE_COLORS_ESCAPE @"\033["

#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

#ifdef DEBUG
    #define NSLogBlueText(format, ...) NSLog((XCODE_COLORS_ESCAPE @"fg0,0,255;" format XCODE_COLORS_RESET), ##__VA_ARGS__);
    #define NSLogRedBG(format, ...) NSLog((XCODE_COLORS_ESCAPE @"bg220,0,0;" format XCODE_COLORS_RESET), ##__VA_ARGS__);
    #define NSLogBlueTextAndRedBG(format, ...) NSLog((XCODE_COLORS_ESCAPE @"fg0,0,255;" XCODE_COLORS_ESCAPE @"bg220,0,0;" format XCODE_COLORS_RESET), ##__VA_ARGS__);
    #define NSLogCustomColor(format, ...) NSLog((XCODE_COLORS_ESCAPE @"fg209,57,168;" format XCODE_COLORS_RESET), ##__VA_ARGS__);
#else
    #define NSLogBlueText(...)
    #define NSLogRedBG(...)
    #define NSLogBlueTextAndRedBG(...)
    #define NSLogCustomColor(...)
#endif

ViewControllerも新しく定義したマクロを使用するよう変更しましょう。

ViewController.m
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLogBlueText(@"Blue text");
    NSLogRedBG(@"Red background");
    NSLogBlueTextAndRedBG(@"Blue text on red background");
    NSLogCustomColor(@"You can supply your own RGB values!");
}

@end

実行してみると、以下のように出力されるかと思います。

ios-console_2

このように、マクロに定義しておけば毎回色の指定を行わずにすみます。ただ、このままだとログに色付けされただけでどの色が何を示すのかわかりません。なので、実際に使用する場合は出力するログのレベルに応じてMYLogErrorやMYLogInfoなど意味を持たせて定義した方がいいです。しかし、これらの定義を毎回新しいプロジェクトを作成する度に設定するのは面倒です。

CocoaLumberjackで簡単色分け!

そんなときに有用なのがCocoaLumberjackです。オープンソース(BSDライセンス)のログライブラリです。このライブラリについてはiOSで使える柔軟なログフレームワーク〜CocoaLumberjackで紹介しているので、そちらを参考に導入してみてください。

CocoaLubmerjackでXcodeColorsを使う

CocoaLubmerjackでXcodeColorsを使うにはAppDelegateの- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsメソッドに以下の一行を追加するだけでOKです。

#import "AppDelegate.h"

#import "DDLog.h"
#import "DDTTYLogger.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Xcodeのコンソールにログを出力する場合は以下を記述する
    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    
    // XcodeColorsを使用する
    [[DDTTYLogger sharedInstance] setColorsEnabled:YES];

    return YES;
}

・・・

@end

上記の設定を記述したら、あとはログを仕込むだけです。

ViewController.m
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    DDLogError(@"NSURLErrorDomainの出力例");
    DDLogWarn(@"DDLogWarnの出力例");
    DDLogInfo(@"DDLogInfoの出力例");
    DDLogVerbose(@"DDLogVerboseの出力例");
}

@end

ios-console_3

出力レベルの色を変える

CocoaLubmerjackで出力されるログの色を自分で決めることもできます。

#import "AppDelegate.h"

#import "DDLog.h"
#import "DDTTYLogger.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Xcodeのコンソールにログを出力する場合は以下を記述する
    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    
    // XcodeColorsを使用する
    [[DDTTYLogger sharedInstance] setColorsEnabled:YES];

    // の文字色を薄い灰色に設定する
    [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor colorWithRed:(178/255.0) green:(178/255.0) blue:(178/255.0) alpha:1.0] backgroundColor:nil forFlag:LOG_FLAG_VERBOSE];
    
    return YES;
}

・・・

@end

ios-console_4

まとめ

これで大量にログを出力しても、一目で目的のログを発見できます!是非試してみてください!

参考