CocoaLumberjack调试和发布的不同日志级别不起作用

时间:2014-04-19 16:28:09

标签: ios logging cocoalumberjack

我正在使用CocoaLumberjack日志框架开发iOS应用程序。在this 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

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

我几乎总是使用Verbose日志,我称之为:

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

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

2 个答案:

答案 0 :(得分:1)

首先,您可以更新您的queston以显示您正在使用的DDLog *调用吗?这可以帮助确认您正在使用实际上正确记录(或不正确)的内容。

其次,显示处于发布模式的调用的一些示例日志也可以提供帮助 - 特别显示它们来自哪个类实例。

那么,您是否 GeneratrTableViewController.m中使用DDLog?你所拥有的只会在GeneratrTableViewController.m中设置ddLogLevel静态const变量。 (我假设这是我正在看的内容,基于代码的样子。)如果您在任何其他文件中使用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会屏蔽在您处于DEBUG的情况下出现的警告,但由于缺少日志记录而无法使用该变量。调试模式中的非常量非常重要 - 如果要覆盖每个类的级别,您将需要能够更改它。但这必须动态发生。

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

+ (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中,以便我可以在以后轻松添加它;改变全局设置也可以正常工作。

答案 1 :(得分: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);