8

我正在使用这个 CocoaLumberjack 框架来记录我在 Objective-C 设计中的所有消息。现在我想将所有错误记录到一个文件中,将所有其他消息记录到另一个文件中。我知道我可以使用格式化程序来过滤这些信息。我在 AppDelegate 中创建了两个 DDFileLogger 实例,但这两个记录器一直写入同一个文件。我想知道是否有一种方法可以指定日志记录目标,以便两个记录器写入两个不同的文件。

4

2 回答 2

7

实现这项工作的关键是为每个 DDFileLogger 设置其自己的 DDLogFileManager,并为每个 DDLogFileManager 设置单独的日志目录路径。DDLogFileManager 使用日志目录路径来确定要记录到哪个文件,因此如果您有两个指向同一个目录,它们将记录到同一个日志文件。所以关键是为每个日志使用单独的目录。

对于两种不同的日志类型:“一”和“二”:

// 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 回答
0

您可以通过使用新功能(每个记录器的不同日志级别)来实现非常接近的目标。请参阅https://github.com/robbiehanson/CocoaLumberjack/wiki/PerLoggerLogLevels。创建 2 个文件记录器(一个具有错误级别,另一个具有详细级别)与您描述的不完全一样,因为错误日志将进入这两个文件。这够好吗?

于 2013-11-21T10:26:29.790 回答