iOSで使える柔軟なログフレームワーク〜CocoaLumberjack

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

iOSアプリをデバッグするときにNSLogを使ってログを確認するのは皆さんも良くやっていると思います。実際に業務で構築するときは、案件に合わせてマクロを定義してデバッグ時とリリース時の出力を制御したりする方も多いのではないでしょうか。毎回この設定を行うのは非常に面倒です。そこで登場するのがCocoaLumberjackです!

CocoaLumberjackとは?

CocoaLumberjackはiOSで利用できるオープンソース(BSDライセンス)のログライブラリです。出力先にコンソール以外を選択することができたり、予め用意されたログ出力レベルに応じてしこんだログの出力を制御できたりと非常に柔軟に使用できます。また、NSLogよりも高速に動作するらしいです。では早速使ってみましょう!

CocoaLumberJackの導入

CocoaLumberJackの導入は非常に簡単です。方法は以下の2つです。

CocoaPodsからインストール

CocoaPodsからインストールする場合は、Podfileに以下を記述します。

pod 'CocoaLumberjack'

ソースをダウンロードして直接追加する

ソースを直接プロジェクトに追加する場合は、Github(robbiehanson/CocoaLumberjack)にソースコードが公開されているのでそこからダウンロードします。あとはCocoaLumberjack/Lumberjack以下のソースをプロジェクトに追加するだけです。

CocoaLumberjackを使う準備

CocoaLumberjackを使うには、AppDelegateの- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsメソッドに以下のコードを記述します。

#import "AppDelegate.h"

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

@implementation AppDelegate

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

・・・

@end

出力先の設定方法

CocoaLumberjackでは以下の出力先が設定可能です。

DDLog
NSLogに変わる標準的なメソッド。
DDTTYLogger
可能であればXcodeのコンソールにログを出力する。
DDASLLogger
アップルのシステムロガーに送信する(送信した内容はConsole.appで確認可能)。
DDFileLogger
ファイルにログを出力する。

出力先は複数設定することが可能で、その場合は以下のように記述します。

#import "AppDelegate.h"

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

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Xcodeのコンソールにログを出力する場合は以下を記述する
    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    
    // アップルのシステムロガーに送信する
    [DDLog addLogger:[DDASLLogger sharedInstance]];

    return YES;
}

・・・

@end

ログの出力レベルを設定する

次にプロジェクトで使用するログの出力レベルを設定します。ログの出力レベルを設定するには以下の記述をXxx-Prefix.pchなどに記述する必要があります。

// 全レベルのログを表示する
static const int ddLogLevel = LOG_LEVEL_VERBOSE;

設定できるログの出力レベルは以下の6つです。

LOG_LEVEL_ERROR
DDLogError関数を使用したログ出力を表示する。
LOG_LEVEL_WARN
DDLogError関数とDDLogWarn関数を使用したログ出力を表示する。
LOG_LEVEL_INFO
DDLogError関数とDDLogWarn関数とDDLogInfo関数を使用したログ出力を表示する。
LOG_LEVEL_DEBUG
DDLogError関数とDDLogWarn関数とDDLogInfo関数とDDLogDebug関数を使用したログ出力を表示する。
LOG_LEVEL_VERBOSE
すべて(DDLogError関数、DDLogWarn関数、DDLogInfo関数、DDLogVerbose関数)のログ出力を表示する。
LOG_LEVEL_OFF
ログを表示しない。

デバッグ時とリリース時で出力するログを変える場合は、以下のようにXxx-Prefix.pchに以下のように記述できます。

#ifdef DEBUG
	// デバッグ時は全レベルのログを表示する
	static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
	// リリース時はログを表示しない
	static const int ddLogLevel = LOG_LEVEL_OFF;
#endif

このように、状況と出力レベルに応じてログの出力を制御できるので、気兼ねなくソース中にログを仕込むことができます。

ログを出力してみよう!

これでCocoaLumberjackを使用する準備ができました。あとはログを仕込むだけです。ログを出力するには以下の5つの関数を使用します。

DDLogError関数
LOG_LEVEL_OFF以外の出力レベルが設定されてた場合に出力される。
DDLogWarn関数
LOG_LEVEL_ERROR、LOG_LEVEL_OFF以外の出力レベルが設定されてた場合に出力される。
DDLogInfo関数
LOG_LEVEL_ERROR、LOG_LEVEL_WARN、LOG_LEVEL_OFF以外の出力レベルが設定されてた場合に出力される。
DDLogDebug関数
LOG_LEVEL_ERROR、LOG_LEVEL_WARN、LOG_LEVEL_INFO、LOG_LEVEL_OFF以外の出力レベルが設定されてた場合に出力される。
DDLogVerbose関数
LOG_LEVEL_VERBOSEが設定されてた場合に出力される。
LOG_LEVEL_OFF
ログを表示しない。

使い方はNSLogと同様です。

// エラーが発生した場合
DDLogError(@"エラーが発生したぞ!");

// 警告が発生した場合
DDLogWarn(@"Warning!");

// おおまかな情報を表示したりなど
DDLogInfo(@"APIから〇〇情報をゲット");
    
// デバッグ情報
DDLogDebug(@"XXXメソッドが実行されました。");
    
// デバッグに必要なより細かい情報など
NSString *str = @"文字列です";
DDLogVerbose(@"strの内容: %@", str);

まとめ

これがあれば、NSLogの面倒な設定を回避できますね!是非使ってみてください!