2014-01-23 69 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)