Уровень журнала CocoaLumberjack переключается на подробный

Я использую инфраструктуру ведения журнала CocoaLumberjack 2.0.0 для ведения журнала с разными уровнями. В моем Prefix.pch (я знаю, что этот файл устарел, но, тем не менее, он должен работать) я включаю Cocoalumberjack и устанавливаю глобальный уровень журнала, как предложено здесь:

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

У меня есть оператор DDLogVerbose для нескольких методов, которые по умолчанию не должны регистрироваться. Проблема. Тем не менее, они появляются в журнале.

Проверка ddLogLevel в функции инициализации показывает 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). Может ли это быть связано с порядком включения заголовков? Или я упускаю какой-то важный момент?


person Florian Gössele    schedule 19.03.2015    source источник
comment
Вы когда-нибудь решали это? У меня похожая проблема.   -  person Zoë Smith    schedule 22.05.2015
comment
@zoë К сожалению, нет, я вернулся к старой доброй регистрации, см. мой ответ ниже.   -  person Florian Gössele    schedule 26.05.2015


Ответы (3)


Я не решил эту проблему, поэтому я написал свой собственный заголовочный файл для ведения журнала:

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

Включайте этот файл везде, где требуется ведение журнала. Надеюсь, это поможет кому-то!

person Florian Gössele    schedule 26.05.2015
comment
Благодарю вас! это было полезно для меня :) - person Natalia; 17.05.2017

Поэтому я не уверен, что это та же проблема, с которой вы столкнулись, но у меня был похожий симптом, то есть мои уровни журнала игнорировались. Что произошло для меня, так это то, что ребята из какао-дровосека упростили в v2 для новых пользователей начало работы, поскольку им вообще не нужно было указывать уровень журнала, чтобы заставить фреймворк работать.

Согласно документам лесорубов, для фактического использования ddLogLevel мне нужно было #define это перед импортом файла CocoaLumberjack.h:

Использование ddLogLevel для начала работы с библиотекой теперь необязательно. Если вы определяете его, добавьте #define LOG_LEVEL_DEF ddLogLevel перед #import и измените его тип на 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
person Zoë Smith    schedule 27.05.2015

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

Надеюсь, это решит вашу проблему.

person iPhoneDeveloper    schedule 13.10.2017