簡體   English   中英

CocoaLumberjack的Log Level切換為詳細

[英]CocoaLumberjack's Log Level switches to verbose

我正在使用CocoaLumberjack日志記錄框架 2.0.0進行不同級別的日志記錄。 在我的Prefix.pch中(我知道該文件已被棄用,但仍然可以運行),我包含Cocoalumberjack並按照此處的建議設置全局日志級別:

#ifdef DEBUG
  static const DDLogLevel ddLogLevel = DDLogLevelDebug;
#else
  static const DDLogLevel ddLogLevel = DDLogLevelWarn;
#endif

我有一些方法的DDLogVerbose語句,默認情況下不應記錄。 問題:但是,它們正在被記錄。

在init函數中檢查ddLogLevel顯示00001111,它等於DDLogLevelDebug 不過,執行此命令后會立即生成詳細的日志記錄語句。 (1)

預處理DDLogVerbose(@"I AM VERBOSE")DDLogVerbose(@"I AM VERBOSE")顯示以下代碼:

do {
        if(DDLogLevelVerbose & DDLogFlagVerbose)
            [DDLog log : __objc_yes
                 level : DDLogLevelVerbose
                  flag : DDLogFlagVerbose
               context : 0
                  file : "....m"
              function : __PRETTY_FUNCTION__
                  line : 59
                   tag : ((void *)0)
                format : (@"I AM VERBOSE")];
    } while(0);

這意味着預處理后的LogLevel是Verbose。 (2)我發現如果未定義日志級別,此級別是CocoaLumberjack中的默認級別:

#ifndef LOG_LEVEL_DEF
    #ifdef ddLogLevel
        #define LOG_LEVEL_DEF ddLogLevel
    #else
        #define LOG_LEVEL_DEF DDLogLevelVerbose
    #endif
#endif

但是:調試表明,第一個路徑已執行,即LOG_LEVEL_DEF (根據語句的級別檢查以確定是否應該記錄該語句)分配了正確的級別(調試)。

問題:我沒有發現為什么(1)顯示LogLevel Debug,並在預處理后將其切換為Verbose (2) 這可能與包含標頭的順序有關嗎? 還是我錯過了一些重要的觀點?

我沒有解決此問題,所以我編寫了自己的頭文件進行記錄:

//  Create Logging Messages by calling the functions:
//  * DDLogFatal(...)
//  * DDLogError(...)
//  * DDLogWarn(...)
//  * DDLogInfo(...)
//  * DDLogDebug(...)
//  * DDLogTrace(...)
//  * DDLogTrace()
//  Only the functions that match Log Level (defined beneath) and above this level will lead to an output.
//
//  NOTE: For this file to work, the option "Treat warnings as errors" must be turned off!

/*********************************
 * CURRENT LOG LEVEL ***
 *********************************/
#define LOG_LEVEL LOG_LEVEL_DEBUG

/* Default Log Level */
#ifndef LOG_LEVEL
    #ifdef DEBUG
        #define LOG_LEVEL LOG_LEVEL_DEBUG
    #else
        #define LOG_LEVEL LOG_LEVEL_WARN
    #endif
#endif

/* List of Log Levels */
#define LOG_LEVEL_OFF    0 // 0000 0000
#define LOG_LEVEL_FATAL  1 // 0000 0001
#define LOG_LEVEL_ERROR  3 // 0000 0011
#define LOG_LEVEL_WARN   7 // 0000 0111
#define LOG_LEVEL_INFO  15 // 0000 1111
#define LOG_LEVEL_DEBUG 31 // 0001 1111
#define LOG_LEVEL_TRACE 63 // 0011 1111

#define LOG_FLAG_FATAL   1 // 0000 0001
#define LOG_FLAG_ERROR   2 // 0000 0010
#define LOG_FLAG_WARN    4 // 0000 0100
#define LOG_FLAG_INFO    8 // 0000 1000
#define LOG_FLAG_DEBUG  16 // 0001 0000
#define LOG_FLAG_TRACE  32 // 0010 0000

#if (LOG_LEVEL & LOG_FLAG_FATAL) > 0
    #define DDLogFatal(...) ALog(@"FATAL", __VA_ARGS__)
#else
    #define DDLogFatal(...)
#endif

#if (LOG_LEVEL & LOG_FLAG_ERROR) > 0
    #define DDLogError(...) ALog(@"ERROR", __VA_ARGS__)
#else
    #define DDLogError(...)
#endif

#if (LOG_LEVEL & LOG_FLAG_WARN) > 0
    #define DDLogWarn(...) ALog(@"WARNING", __VA_ARGS__)
#else
    #define DDLogWarn(...)
#endif

#if (LOG_LEVEL & LOG_FLAG_INFO) > 0
    #define DDLogInfo(...) ALog(@"INFO", __VA_ARGS__)
#else
    #define DDLogInfo(...)
#endif

#if (LOG_LEVEL & LOG_FLAG_DEBUG) > 0
    #define DDLogDebug(...) ALog(@"DEBUG", __VA_ARGS__)
#else
    #define DDLogDebug(...)
#endif

#if (LOG_LEVEL & LOG_FLAG_TRACE) > 0
    #define DDLogTrace(...) ALog(@"TRACE", __VA_ARGS__)
    #define DDLogEntry() ALog(@"TRACE", @"->")
#else
    #define DDLogTrace(...)
    #define DDLogEntry()
#endif

#define ALog(logLevel, fmt, ...) NSLog((@"%s [Line %d] %@: " fmt), __PRETTY_FUNCTION__, __LINE__, logLevel, ##__VA_ARGS__)

在需要記錄日志的任何地方都包括此文件。 希望這對某人有幫助!

因此,我不確定這是否與您遇到的問題相同,但是我有類似的症狀,即我的日志級別被忽略。 對我而言,可可伐木工人無需完全指定日志級別就可以使框架正常工作,從而使v2中的新用戶更容易入門。

根據伐木工人文檔 ,要實際使用ddLogLevel,我需要導入CocoaLumberjack.h文件之前 #define它:

現在可以選擇使用ddLogLevel開始使用該庫。 如果定義它,則在#import之前添加#define LOG_LEVEL_DEF ddLogLevel並將其類型更改為DDLogLevel

就我而言,我正在.pch文件中執行此操作,因此它看起來像:

// ProjectX.pch
#define LOG_LEVEL_DEF ddLogLevel // this is the crucial bit!
#import "CocoaLumberjack/CocoaLumberjack.h"

// Then the normal definitions... 
#ifdef DEBUG
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
static DDLogLevel ddLogLevel = DDLogLevelWarning;
#pragma clang diagnostic pop
#else
static const DDLogLevel ddLogLevel = DDLogLevelWarning;
#endif
#define LOG_LEVEL_DEF ddLogLevel

CocoaLumberjack有4個日志級別

  1. 錯誤
  2. 警告
  3. 信息
  4. 詳細

“ ddLogLevel”確定要執行的日志和要忽略的日志。 如果您不希望執行DDLogVerbose,請更改為較低的級別,例如Info。

如下更改DEBUG宏

#ifdef DEBUG
static const int ddLogLevel = LOG_LEVEL_INFO;
#else
static const int ddLogLevel = LOG_LEVEL_ERROR;
#endif

希望這能解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM