8

このCocoaLumberjackフレームワークを使用して、すべてのメッセージをObjective-Cデザインに記録しています。ここで、すべてのエラーを1つのファイルに記録し、他のすべてのメッセージを別のファイルに記録します。フォーマッターを使用してこの情報をフィルタリングできることはわかっています。AppDelegateで2つのDDFileLoggerインスタンスを作成しましたが、これら2つのロガーは同じファイルに書き込みを続けます。2つのロガーが2つの異なるファイルに書き込むように、ログの宛先を指定する方法があるのではないかと思います。

4

2 に答える 2

7

これを機能させるための鍵は、各 DDFileLogger に独自の DDLogFileManager を設定し、それぞれに個別のログ ディレクトリ パスを設定することです。DDLogFileManager は、ログ ディレクトリ パスを使用して、どのファイルにログを記録するかを決定します。そのため、それらのうちの 2 つが同じディレクトリを指している場合、同じログ ファイルにログが記録されます。したがって、重要なのは、ログごとに個別のディレクトリを使用することです。

「One」と「Two」の 2 つの異なるログ タイプの場合:

// Set the base log directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"];

// set up file logger One to log to subdirectory "One"
DDLogFileManagerDefault *fileManagerOne = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"One"]];
DDFileLogger *loggerOne = [[DDFileLogger alloc] fileManagerOne];

// Use the filter formatter to make sure only "One" logs go to the "One" log files
ContextWhitelistFilterLogFormatter *formatterOne = [[ContextWhitelistFilterLogFormatter alloc] init];
[formatterOne addToWhitelist:LOG_CONTEXT_ONE];
[loggerOne formatterOne];

[DDLog loggerOne];

    // set up file logger Two to log to subdirectory "Two"
DDLogFileManagerDefault *fileManagerTwo = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"Two"]];
DDFileLogger *loggerTwo = [[DDFileLogger alloc] fileManagerTwo];

// Use the filter formatter to make sure only "Two" logs go to the "Two" log files
ContextWhitelistFilterLogFormatter *formatterTwo = [[ContextWhitelistFilterLogFormatter alloc] init];
[formatterTwo addToWhitelist:LOG_CONTEXT_TWO];
[loggerTwo formatterTwo];

[DDLog loggerTwo];

もちろん、ロギングを行うためにマクロを定義する必要があります。

#define LOG_CONTEXT_ONE    1
#define LOG_CONTEXT_TWO    2

#define LogOne(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, LOG_CONTEXT_ONE, frmt, ##__VA_ARGS__)
#define LogTwo(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, LOG_CONTEXT_TWO, frmt, ##__VA_ARGS__)

これが私のために働いたものです。

于 2013-01-08T10:43:27.963 に答える