0

我正在使用CocoaLumberjack 日志框架2.0.0 进行不同级别的日志记录。在我的 Prefix.pch 中(我知道这个文件已被弃用,但它应该可以工作)我包括 Cocoalumberjack 并按照此处的建议设置全局日志级别:

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

我有DDLogVerbose一些方法的声明,默认情况下不应该记录。问题:但是,他们正在被记录。

检查ddLogLevelinit 函数中的 00001111,它等于DDLogLevelDebug. 然而,在此之后直接执行一个详细的日志记录语句。(1)

预处理行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)。这可能是包含标题的顺序问题吗?还是我错过了一些重要的点?

4

3 回答 3

1

我没有解决这个问题,所以我编写了自己的日志头文件:

//  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__)

在需要 Logging 的地方包含此文件。希望这对某人有帮助!

于 2015-05-26T11:14:44.860 回答
1

所以我不确定这是否与您遇到的问题相同,但我有类似的症状,即我的日志级别被忽略。对我来说发生的事情是,可可伐木工人在 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
于 2015-05-27T00:00:42.273 回答
0

CocoaLumberjack 有 4 个日志级别

  1. 错误
  2. 警告
  3. 信息
  4. 详细

“ddLogLevel”决定了哪些日志被执行,哪些被忽略。如果您不希望执行 DDLogVerbose,请更改为较低级别,例如 Info。

按如下方式更改您的调试宏

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

希望这可以解决您的问题。

于 2017-10-13T12:34:03.477 回答