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

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

任何想法,我怎么能做到这一点?

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

从伐木工人框架开始: https : //github.com/robbiehanson/CocoaLumberjack

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

有几个方法可以做到这一点。 这里有一个例子:添加2个文件logging器:

 fileLoggerA = [[DDFileLogger alloc] init]; fileLoggerB = [[DDFileLogger alloc] init]; [DDLog addLogger:fileLoggerA]; [DDLog addLogger:fileLoggerB]; 

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

我们将通过创build2个不同的日志loggingmacros来完成这项工作:ALog()&BLog()

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具有1的“上下文”,并且BLog具有2的“上下文”。

现在你只需要创build一个“自定义格式化程序/filter”。 这是一个例子:

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

当然,将您的自定义格式化程序/filter添加到文件logging器:

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

有关这些主题的更多信息可以通过伐木工人项目页面find:

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 /维基/ CustomLogLevels