2014-01-23 67 views
1

我已经开始使用CocoaLumberjack并有兴趣使用它们的自定义日志级别功能。他们有一个方便的配置可在https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels让你开始。我不知道我现在想要什么,所以我就这样离开了。CocoaLumberjack自定义日志级别

接下来,我用这个把我的调试级别在我的代码...

static const int ddLogLevel = LOG_LEVEL_DEBUG; 

然而与此设置只能出现更严重比LOG_LEVEL_DEBUG的消息得到呈现。显示DDlogInfo()和以上的含义,而不是DDLogDebug()。当我向上滑动时也是如此。所以...

static const int ddLogLevel = LOG_LEVEL_INFO; 

...忽略DDLogInfo()和DDLogDebug(),但为DDLogNotice()和更高版本显示。预计的行为当然是包含该警告级别。

这里的内心深处CocoaLumberjack的代码,使决策...

for (DDLoggerNode *loggerNode in loggers) { 
    // skip the loggers that shouldn't write this message based on the logLevel 

    if (!(logMessage->logFlag & loggerNode.logLevel)) { 
     continue; 
    } 

    dispatch_group_async(loggingGroup, loggerNode->loggerQueue, ^{ @autoreleasepool { 

     [loggerNode->logger logMessage:logMessage]; 

    }}); 
} 

在我的第一个例子,我的日志级别111111(63)和信息标志(使用DDLogDebug())为100000(32 )。 32是YES,因此失败(使用NOT)。所以我会认为这个消息会被记录下来。将日志方法移至DDLogInfo(),该日志方法的消息标志为010000(16)。这仍然是,因此不符合,因此我们得到记录。但我在这种情况下看到它。有人对此有经验吗?

+0

我刚刚在测试这个我自己的项目使用伐木工人,我可以确认它的工作原理就像你期望的那样。如果我将级别设置为'LOG_LEVEL_WARN',然后我看到所有的警告和以上。如果我将它设置为'LOG_LEVEL_INFO',我会看到所有信息及以上。您是否添加了任何额外的代码来自定义/更改日志级别? –

+0

@JamesFrost,唯一的修改是使用CL的“MYLog.h”,该链接位于上面的链接处。我切换回正常的处理,它确实工作正常。它们如何为其“自定义”级别创建位掩码一定是个问题。 – rob5408

回答

1

我想我已经完成了它。在CocoaLumberjack本身,在DDLog.h,日志级别标志的定义,像这样:

#define LOG_FLAG_ERROR (1 << 0) // 0...00001 
#define LOG_FLAG_WARN  (1 << 1) // 0...00010 
#define LOG_FLAG_INFO  (1 << 2) // 0...00100 
#define LOG_FLAG_DEBUG (1 << 3) // 0...01000 
#define LOG_FLAG_VERBOSE (1 << 4) // 0...10000 

然而,CustomLogLevels MyLog.h文件定义他们像这样:

#define LOG_FLAG_FATAL (1 << 0) // 0...000001 
#define LOG_FLAG_ERROR (1 << 1) // 0...000010 
#define LOG_FLAG_WARN (1 << 2) // 0...000100 
#define LOG_FLAG_NOTICE (1 << 3) // 0...001000 
#define LOG_FLAG_INFO (1 << 4) // 0...010000 
#define LOG_FLAG_DEBUG (1 << 5) // 0...100000 

需要注意的是它增加了一个额外的FATAL标志,其效果是将所有其他标志转移到某个地方。这是你看到的问题的原因。

+0

嗨,詹姆斯,也在MyLog.h中,所有的东西都先得到#undef'd,所以我不认为就是这样。我认为它实际上与MyLog.h构建每个级别的方式有关。他们或以前的LEVEL与当前的FLAG,并为每个FLAG继续这样做。在DDLog.h中,它们对每个LEVEL或每个FLAG进行组合。虽然手执行这不会有任何区别,但它是两种方法之间唯一不同的东西。我可以通过将MyLog.h更改为相同的技术来确认这一点,但我已经开始了。 :/ 谢谢您的帮助! – rob5408

+0

是的,他们#undef现有的日志级别的定义,然后(如我在上面的回答中)他们重新定义他们 - 但通过添加'LOG_FLAG_FATAL',他们将所有其他标志下移一个地方。 –

+0

DDLogDebug等也被重新定义。我想象一下,如果LOG_FLAG_DEBUG被重新定义并且DDLogDebug被设置为查找该值,然后我的应用程序将其日志级别设置为LOG_LEVEL_DEBUG,那么它们全部匹配。我想我没跟着。 – rob5408

0

,如果你有比内置的高定制水平,尝试用初始化:

[DDLog addLogger: [DDASLLogger sharedInstance] withLogLevel: LOG_LEVEL_CUSTOM]; 
[DDLog addLogger: [DDTTYLogger sharedInstance] withLogLevel: LOG_LEVEL_CUSTOM]; 

其中LOG_LEVEL_CUSTOM在您MyLog.h定义为:

#define LOG_LEVEL_CUSTOM (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_CUSTOM)