CocoaLumberjack разные уровни LogLevels для Debug и Relase не работают

Я разрабатываю приложение для iOS, используя структуру ведения журналов CocoaLumberjack. На этом вики-сайте есть статья о том, как автоматически использовать разные уровни журнала для отладки и выпуска. . Я реализовал код следующим образом:

#import "TableViewController.h"
#import "DDLog.h"

@interface TableViewController ()

@end


#ifdef DEBUG
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
static const int ddLogLevel = LOG_LEVEL_WARN;
#endif

@Implementation TableViewController

Но это не работает, и если я запускаю конфигурацию релиза, она также записывает подробные журналы.

Я почти всегда использую подробные журналы, которые я называю так:

DDLogVerbose(@"Some log...");

Я использую CocoaLumberjack в каждом классе, и у меня такая же реализация LogLevel во всех других файлах .m.


person lukas    schedule 19.04.2014    source источник
comment
это же не копипаст? объявление интерфейса должно быть в заголовочном файле между прочим... поэтому вставьте реальный код, который вы используете, тогда ответ на вопрос будет очевиден   -  person Michael    schedule 19.04.2014
comment
У меня есть часть @implementation в моем файле .m, и она работает нормально. Это на самом деле реальный код   -  person lukas    schedule 19.04.2014
comment
да, извините, я пропустил () рядом с объявлением интерфейса...   -  person Michael    schedule 19.04.2014
comment
@Lukas Обновил мой ответ ниже, так как ваши обновления помогли мне понять вашу проблему.   -  person greymouser    schedule 19.04.2014
comment
@greymouser Большое спасибо!   -  person lukas    schedule 20.04.2014
comment
@ 130e13a - Я пытаюсь использовать библиотеку Cocoalumberjack в своем приложении и хотел бы знать, как и где можно собирать или просматривать журналы RELEASE. Не могли бы вы мне помочь?   -  person Lohith Korupolu    schedule 25.10.2019


Ответы (2)


Во-первых, можете ли вы обновить свой вопрос, чтобы показать, какие вызовы DDLog* вы используете? Это может помочь подтвердить, что вы используете что-то, что действительно регистрируется (или нет) правильно.

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

Итак, вы только используете DDLog в GeneratrTableViewController.m? То, что у вас есть, установит статическую константную переменную ddLogLevel только в GeneratrTableViewController.m. (Я предполагаю, что это то, на что я смотрю, основываясь на том, как выглядит код.) Если вы используете вызовы DDLog* в любых других файлах, он будет использовать любой уровень журнала по умолчанию.

ОБНОВЛЕНИЕ

Хорошо, ваше обновление помогло мне понять, где вы были. Вы не должны настраивать его таким образом для каждого класса.

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

#ifdef DEBUG
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wunused-variable"
    static int ddLogLevel = LOG_LEVEL_DEBUG;
    #pragma clang diagnostic pop
#else
    static const int ddLogLevel = LOG_LEVEL_WARN;
#endif

#pragma не предупреждать о неиспользуемых переменных маскирует предупреждения, возникающие в крайнем случае, когда вы находитесь в режиме DEBUG, но переменная не используется из-за отсутствия ведения журнала. Неконстантность в режиме отладки здесь важна — если вы хотите переопределить уровень для каждого класса, вам нужно будет иметь возможность его изменить. Но это должно происходить динамически.

Для каждого класса, в котором вы можете переопределить параметр ведения журнала, вам потребуется что-то вроде следующего (и по-прежнему добавляйте указанное выше в предварительно скомпилированный заголовок).

+ (void)initialize
{
    [self ddSetLogLevel:LOG_LEVEL_VERBOSE];
}

+ (int)ddLogLevel
{
    return LOG_LEVEL_VERBOSE;
}

+ (void)ddSetLogLevel:(int)logLevel
{
    ddLogLevel = logLevel;
}

Я стараюсь держать свой глобальный уровень на уровне DEBUG (в режиме DEBUG). Затем я добавляю приведенный выше код в классы, когда активно их разрабатываю, и активно использую DDLogVerbose. Затем, когда основная разработка завершена, я оборачиваю ее в #if 0/#endif, чтобы я мог легко добавить ее позже; изменение глобальной настройки также будет работать нормально.

person greymouser    schedule 19.04.2014

Вдохновленный ответом @greymouser, я собрал следующий макрос препроцессора, который будет включен в файл .pch для проекта, что позволяет устанавливать уровень журнала для каждого файла в режиме отладки, устанавливая все на уровень по умолчанию. в других режимах. Подавление предупреждений также включено в макрос для сохранения строк кода в самих файлах классов.

#undef  LOG_LEVEL_DEF // Undefine first only if needed
#define LOG_LEVEL_DEF ddLogLevel

#ifdef DEBUG
    #define DD_LOGGING_LEVEL(loggingLevel) _Pragma("clang diagnostic push") \
                                           _Pragma("clang diagnostic ignored \"-Wunused-variable\"") \
                                           static DDLogLevel ddLogLevel = loggingLevel \
                                            _Pragma("clang diagnostic push")

#else 
    #define DD_LOGGING_LEVEL(loggingLevel) _Pragma("clang diagnostic push") \
                                           _Pragma("clang diagnostic ignored \"-Wunused-variable\"") \
                                           static const DDLogLevel ddLogLevel = DDLogLevelError \
                                           _Pragma("clang diagnostic push")
#endif

Использование:

в файлах .m:

DD_LOGGING_LEVEL(DDLogLevelVerbose);
person lance-ios    schedule 10.04.2015