【问题标题】:Creating multiple log files in iPhone app在 iPhone 应用程序中创建多个日志文件
【发布时间】:2011-08-21 10:59:13
【问题描述】:

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

【问题讨论】:

    标签: iphone ios ipad logging nslog


    【解决方案1】:

    从 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() 和 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。

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

    - (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

    【讨论】:

    • 我已经尝试过了,看起来两个文件记录器都将它们的输出定向到同一个文件。这在设备和模拟器上都有。
    【解决方案2】:

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

    【讨论】:

    • 这就是我的想法,但我一直在寻找一些可以为我做这件事的框架,我可以节省编写自定义记录器的时间。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多