0

Я использую CocoaLumberjack logging framework 2.0.0 для регистрации на разных уровнях. В моей Prefix.pch (я знаю, что этот файл является устаревшим, но он должен работать, тем не менее) я включаю Cocoalumberjack и установить глобальный уровень журнала, как предложил here:CocoaLumberjack's Log Level переключается на подробный

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

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

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

+0

Вы когда-нибудь решали это? У меня такая же проблема. –

+0

@ zoë К сожалению, нет, я вернулся к обычной старой регистрации, см. Мой ответ ниже. –

ответ

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. Надеюсь, это поможет кому-то!

+0

Спасибо! это было полезно для меня :) – Natalia

1

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

Согласно lumberjack docs, на самом деле использовать 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 
0

CocoaLumberjack имеет 4 уровня журнала

  1. Ошибка
  2. Предупреждение
  3. информация
  4. Verbose

"ddLogLevel" определяет какие журналы должны быть выполнены и которые следует игнорировать. Если вы не хотите, чтобы DDLogVerbose выполнялся, измените его на более низкие уровни, например Info.

Изменить DEBUG макрос следующим образом

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

Надеется, что это решает проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^