在iPhone应用程序中创建多个日志文件

时间:2011-08-21 10:59:14

标签: iphone ios ipad logging nslog

我想在iPhone应用程序中创建两个日志文件。如果我使用freopen()将NSLog输出重定向到一个文件,那么所有的日志语句都会进入一个提到的文件。
但是我想把一些日志语句放到一个文件中,而有些则放在不同的文件中。

任何想法,我该怎么做?

2 个答案:

答案 0 :(得分:14)

从Lumberjack框架开始:https://github.com/robbiehanson/CocoaLumberjack

  

我想将一些日志语句放入一个文件中,而将一些日志语句放入不同的文件

有几种方法可以实现这一目标。这是一个例子: 添加2个文件记录器:

fileLoggerA = [[DDFileLogger alloc] init];
fileLoggerB = [[DDFileLogger alloc] init];

[DDLog addLogger:fileLoggerA];
[DDLog addLogger:fileLoggerB];

所以在这一点上,所有日志语句都将被定向到fileLogger1& fileLogger2。接下来,我们将为每个fileLogger添加一个“过滤器”,以便它们忽略不针对它们的日志语句。

我们将通过创建2个不同的日志记录宏来实现:ALog()&博客()

fileLoggerA只会从ALog()中写入日志语句。 fileLoggerB只会从BLog()中写入日志语句。

要进行此设置,我们可以利用“日志记录上下文”。你可以做一些简单的事情:

#define ALog(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, 1, frmt, ##__VA_ARGS__)
#define BLog(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, 2, frmt, ##__VA_ARGS__)

显然你可以获得比这更高级的功能(例如添加对日志级别的支持等)但需要注意的是ALog的“context”为1,而BLog的“context”为2。

现在您只需要创建一个“自定义格式化程序/过滤器”。这是一个例子:

- (NSString *)formatLogMessage:(DDLogMessage *)logMessage
{
    if (logMessage->logContext == theContextIShouldLog)
        return logMessage->logMsg;
    else
        return nil;
}

当然,将自定义格式化程序/过滤器添加到文件记录器:

[fileLoggerA setLogFormatter:[MyContextFilter filterWith:1]];
[fileLoggerB setLogFormatter:[MyContextFilter filterWith:2]];

有关这些主题的更多信息可以通过Lumberjack项目页面找到:

https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomContext https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels

答案 1 :(得分:2)

最好的方法是将您自己的记录器类编写为您使用的替代品,而不是NSLog()。这样,您可以在运行时轻松确定应将哪些日志写入哪个文件。您的自定义类可以使用NLog()同时写入控制台。这似乎是最佳方法,因为freopen()只是批量重定向所有日志输出。