CocoaLumberjackでファイル出力を行う際に、任意の名前・拡張子を付ける方法

2014.10.09

CocoaLumberjackでファイル保存を行う際に、任意の名前・拡張子を付ける方法

こんばんは!荒川です。

前回のCocoaLumberjackで複数のログファイルに出力分けできるマクロを作ってみたに引き続き、今回はCocoaLumberjackで任意の名前・拡張子の出力ファイルを作成する手順を紹介致します。

前回作成したログファイルは「アプリ名 日時.log」というファイル名で出力されていました。

開発環境に最適なログファイルを出力し、スムーズに開発を進めましょう!

出力ファイル名を変更する

CocoaLumberjackでログファイルの名前を設定している箇所は以下のメソッドです。

DDFileLogger.m

- (NSString *)newLogFileName

こちらに記載されているAppleDocを見ると、変更したければこのメソッドの他に、isLogFile:メソッドをオーバーライドしてねと書いてあります。

早速、こちらをオーバーライドして変更してみましょう。まずは、DDLogFileManagerDefaultクラスを継承したサブクラスを作成します。

スクリーンショット 2014-10-09 20.25.02

SampleLogFileManagerDefault.h

#import "DDFileLogger.h"

@interface SampleLogFileManagerDefault : DDLogFileManagerDefault

/**
 *  DDLogFileManagerDefaultインスタンスを返却する指定イニシャライザです。
 *
 *  @param logsDirectory 出力ディレクトリ
 *  @param name          出力ファイル名
 *  @param extension     出力ファイル拡張子
 *
 *  @return DDLogFileManagerDefaultインスタンス
 */
- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory
                             fileName:(NSString *)name
                        fileExtension:(NSString *)extension;

@end

ヘッダーではイニシャライザだけ定義しています。

SampleLogFileManagerDefault.m

#import "SampleLogFileManagerDefault.h"

@interface SampleLogFileManagerDefault ()

@property (nonatomic, copy) NSString *fileName;
@property (nonatomic, copy) NSString *fileExtension;

@end

@implementation SampleLogFileManagerDefault

#pragma mark - Lifecycle method

- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory
                             fileName:(NSString *)name
                        fileExtension:(NSString *)extension
{
    self = [super initWithLogsDirectory:logsDirectory];
    if (self) {
        self.fileName = name;
        self.fileExtension = extension;
    }
    return self;
}

#pragma mark - Override methods

- (NSString *)newLogFileName
{
    return [NSString stringWithFormat:@"%@.%@", self.fileName, self.fileExtension];
}

- (BOOL)isLogFile:(NSString *)fileName
{
    return [super isLogFile:[self newLogFileName]];
}

@end

イニシャライザで指定された名前と拡張子をクラスで保持し、オーバーライドするメソッドを定義しています。

あとは呼び出し元のDDLogFileManagerDefaultクラスを新しく作成したクラスへ変更すれば完了です。

以前のサンプルコードを使います。

AppDelegate.m

#import "SampleLogFileManagerDefault.h"

...省略

#pragma mark - DDLogFile Settings methods

/**
 *  ログファイルの出力設定
 */
- (void)logFileSettings
{
    // ログファイル出力先のベースパス指定
    // Documentsディレクトリ下にログファイルが保存されます。
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask,
                                                         YES);
    NSString *documentPathStr = paths[0];
    // ログファイル出力先ディレクトリの指定
    NSString *filePathStrForFileSystem = [documentPathStr stringByAppendingString:@"/log-System"];
    NSString *filePathStrForFileLocation = [documentPathStr stringByAppendingString:@"/log-Location"];
    NSString *filePathStrForFileError = [documentPathStr stringByAppendingString:@"/log-Error"];

    SampleLogFileManagerDefault *fileSystemLogManager = [[SampleLogFileManagerDefault alloc] initWithLogsDirectory:filePathStrForFileSystem
                                                                                                      fileName:@"SystemLog"
                                                                                                 fileExtension:@"log"];
    SampleLogFileManagerDefault *fileLocationLogManager = [[SampleLogFileManagerDefault alloc] initWithLogsDirectory:filePathStrForFileLocation
                                                                                                            fileName:@"LocationLog"
                                                                                                       fileExtension:@"csv"];
    SampleLogFileManagerDefault *fileErrorLogManager = [[SampleLogFileManagerDefault alloc] initWithLogsDirectory:filePathStrForFileError
                                                                                                         fileName:@"ErrorLog"
                                                                                                    fileExtension:@"txt"];

    [self fileManagerSettings:fileSystemLogManager formatter:[LogFileFormatterCreator createLogFileSystemFormatter]];
    [self fileManagerSettings:fileLocationLogManager formatter:[LogFileFormatterCreator createLogFileLocationFormatter]];
    [self fileManagerSettings:fileErrorLogManager formatter:[LogFileFormatterCreator createLogFileErrorFormatter]];
}

/**
 *  ログファイル出力フォーマットの設定
 *
 *  @param manager       ログファイル出力マネージャー
 *  @param fileFormatter ログファイル出力フォーマット
 */
- (void)fileManagerSettings:(SampleLogFileManagerDefault *)manager
                  formatter:(LogFileFormatter *)fileFormatter
{
    DDFileLogger *fileLogger = [[DDFileLogger alloc] initWithLogFileManager:manager];
    // 1MByteまで出力可能
    fileLogger.maximumFileSize = DEFAULT_LOG_MAX_FILE_SIZE;
    // ログファイルのサイズが1MByteを超えた場合、5個まで新しいログファイルが生成できます。
    fileLogger.logFileManager.maximumNumberOfLogFiles = DEFAULT_LOG_MAX_NUM_LOG_FILES;
    fileLogger.logFormatter = fileFormatter;

    [DDLog addLogger:fileLogger];
}

以上を実装の上、フォーマットに沿ったログを出力すると・・・

スクリーンショット 2014-10-09 20.49.51

スクリーンショット 2014-10-09 20.49.39

スクリーンショット 2014-10-09 20.49.29

上記の様にいい感じにログファイルが出力されましたね。

まとめ

作成するアプリケーションによって、出力したいログファイル名や拡張子は様々です。

CocoaLumberjackでは、デフォルトだと「アプリ名 日時.log」のみなので、最適なログファイル名・拡張子で管理しましょう。