0

我正在使用 CocoaLumberjack 日志框架开发一个 iOS 应用程序。在这个wiki 站点上有一篇关于如何自动使用不同的日志级别进行调试和发布的文章。我实现了如下代码:

#import "TableViewController.h"
#import "DDLog.h"

@interface TableViewController ()

@end


#ifdef DEBUG
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
static const int ddLogLevel = LOG_LEVEL_WARN;
#endif

@Implementation TableViewController

但它不起作用,如果我正在运行 relase 配置,它仍然会记录详细日志。

我几乎总是使用这样的 Verbose 日志:

DDLogVerbose(@"Some log...");

我在每个类中都使用 CocoaLumberjack,并且在所有其他 .m 文件中都有相同的 LogLevel 实现。

4

2 回答 2

1

首先,您能否更新您的问题以显示您正在使用的 DDLog* 调用?这可以帮助确认您使用的东西实际上会被正确记录(或不正确)。

其次,您的一些示例日志显示在发布模式下的调用也可能有所帮助——特别是显示它们来自哪些类实例。

那么,您使用 DDLog inGeneratrTableViewController.m吗?您所拥有的将仅在GeneratrTableViewController.m. (我假设这就是我正在查看的内容,基于代码的样子。)如果您在任何其他文件中使用 DDLog* 调用,它将使用那里的默认日志级别。

更新

好的,您的更新帮助我了解了您的位置。您不应该为每个班级都进行这样的设置。

首先,在全局范围内执行,将类似以下内容添加到您的预编译头文件中——不是每个文件,也不是头文件——

#ifdef DEBUG
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wunused-variable"
    static int ddLogLevel = LOG_LEVEL_DEBUG;
    #pragma clang diagnostic pop
#else
    static const int ddLogLevel = LOG_LEVEL_WARN;
#endif

#pragma 不会对未使用的变量发出警告,这会掩盖在您处于调试中的极端情况下出现的警告,但由于缺少日志记录,该变量恰好没有被使用。这里调试模式下的非常量很重要——如果你想覆盖每个类的级别,你需要能够改变它。但这必须动态发生。

对于您可能想要覆盖日志记录设置的每个类,您需要类似以下内容(并且仍将上述内容添加到您的预编译头文件中)。

+ (void)initialize
{
    [self ddSetLogLevel:LOG_LEVEL_VERBOSE];
}

+ (int)ddLogLevel
{
    return LOG_LEVEL_VERBOSE;
}

+ (void)ddSetLogLevel:(int)logLevel
{
    ddLogLevel = logLevel;
}

我倾向于将我的全局级别保持在 DEBUG(在 DEBUG 模式下)。然后,当我积极开发它们并自由使用 DDLogVerbose 时,我将上面的代码直接添加到类中。然后,当主开发完成后,我将其包装起来,#if 0/#endif以便稍后轻松添加;更改全局设置也可以正常工作。

于 2014-04-19T16:35:30.890 回答
0

受@greymouser 回答的启发,我将以下预处理器宏放在一起,以包含在项目的 .pch 文件中,它允许在调试模式下基于每个文件设置日志级别,同时将所有内容设置为默认级别在其他模式。宏中还包含警告抑制,以将代码行保存在类文件本身中。

#undef  LOG_LEVEL_DEF // Undefine first only if needed
#define LOG_LEVEL_DEF ddLogLevel

#ifdef DEBUG
    #define DD_LOGGING_LEVEL(loggingLevel) _Pragma("clang diagnostic push") \
                                           _Pragma("clang diagnostic ignored \"-Wunused-variable\"") \
                                           static DDLogLevel ddLogLevel = loggingLevel \
                                            _Pragma("clang diagnostic push")

#else 
    #define DD_LOGGING_LEVEL(loggingLevel) _Pragma("clang diagnostic push") \
                                           _Pragma("clang diagnostic ignored \"-Wunused-variable\"") \
                                           static const DDLogLevel ddLogLevel = DDLogLevelError \
                                           _Pragma("clang diagnostic push")
#endif

用法:

在 .m 文件中:

DD_LOGGING_LEVEL(DDLogLevelVerbose);
于 2015-04-10T10:00:10.910 回答