Можно ли отключить отображение NSLog в консоли устройства?

У меня есть встроенное приложение, которое работает на устройстве. Я открываю представление консоли устройства в окне организатора XCode. Я предполагаю (ради этого вопроса), что вызывается NSLog(@"Some string").

Есть ли способ, может быть опция в настройках устройства или приложения, которая отключит отображение этого журнала в консоли?

Изменить: я не заинтересован в замене NSLog другим решением, которое может достичь этого эффекта. Цель этого вопроса — полностью понять функциональность NSLog.


person Max Yankov    schedule 20.01.2014    source источник
comment
Найдите в Google Objective-C DLog.   -  person Wain    schedule 20.01.2014
comment
@Wain это было бы полезно, если бы цель моего вопроса заключалась в достижении этого эффекта - скрыть NSLogs из консоли. Это не.   -  person Max Yankov    schedule 20.01.2014
comment
Вот что он делает. Сам NSLog не предлагает никаких опций, поэтому вам нужна некоторая оболочка вокруг него, чтобы вы могли отключать журналы по запросу или для своей сборки выпуска.   -  person Wain    schedule 20.01.2014
comment
Я не хочу отключать журналы. Я хочу понять, как теоретически их можно отключить, чтобы понять, почему они не появляются, когда должны.   -  person Max Yankov    schedule 20.01.2014
comment
Нет настройки (насколько я знаю), которая отключает NSLog. Но журналы в конечном итоге печатаются в stderr, поэтому закрытие или перенаправление stderr будет иметь такой эффект, сравните ответ trojanfoe ниже.   -  person Martin R    schedule 20.01.2014


Ответы (4)


(Спасибо @MartinR за то, что побудил меня вытащить палец из этого ответа и правильно определить, что вы не можете просто закрыть stdout/stderr, так как следующий open() будет повторно использовать эти файловые дескрипторы, а перенаправить stdout/stderr на печально известный /dev/null).

logControl.h:

#pragma once

extern void stopLogging();
extern void startLogging();

logControl.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static int loggingStopped = 0;
static int oldStdout = -1;
static int oldStderr = -1;

void stopLogging() {
    if (!loggingStopped) {
        oldStdout = dup(1);
        oldStderr = dup(2);

        int devNull = open("/dev/null", O_WRONLY);
        dup2(devNull, 1);
        dup2(devNull, 2);
        close(devNull);

        loggingStopped = 1;
    }
}

void startLogging() {
    if (loggingStopped && oldStdout >= 0 && oldStderr >= 0) {
        dup2(oldStdout, 1);
        close(oldStdout);
        oldStdout = -1;

        dup2(oldStderr, 2);
        close(oldStderr);
        oldStderr = -1;

        loggingStopped = 0;
    }
}

Это работает во время runtime, а не во время компиляции, о чем, как я полагаю, вы и просите. Просто вызовите stopLogging() или startLogging() по мере необходимости.

ПРИМЕЧАНИЕ. О проверке ошибок не может быть и речи, так что, возможно, ее можно улучшить.

person trojanfoe    schedule 20.01.2014
comment
Лучше использовать dup2() для перенаправления stderr в /dev/null. В противном случае следующий открытый файл будет повторно использовать эти файловые дескрипторы. См. пример на stackoverflow.com/a/12611692/1187415. - person Martin R; 20.01.2014
comment
@MartinR Да, я думаю, ты прав. Вам также придется сохранить старый stdout и stderr на случай, если вы захотите снова открыть его. Не имеет значения - этот ответ все равно не нравится ;-) - person trojanfoe; 20.01.2014
comment
Проблема может заключаться в том, что неясно (и неправильно понято некоторыми людьми), какой ответ ожидает ОП. Мне кажется, ваш ответ ближе всего к возможному ответу. - person Martin R; 20.01.2014
comment
@MartinR Хорошо, я приложу некоторые усилия. - person trojanfoe; 20.01.2014

Добавьте эту строку, указанную ниже, в ваш файл .pch в Xcode.

   #define NSLog(...)

Это отключит все NSLogs.

дополнительные варианты см. по ссылке.

person Ankush    schedule 20.01.2014

#if TARGET_IPHONE_SIMULATOR

//Simulator

#else

// Device
#define NSLog
#endif

Добавьте это в свой файл .pch, это отключит NSLog только для устройства, а не для симулятора.

person CoolMonster    schedule 20.01.2014

Добавьте приведенный ниже код в файл .pch.

#ifdef DEBUG
#    define NSLog(...) NSLog(__VA_ARGS__)
#else
#   define NSLog(...) /* */
#endif

И в настройках сборки найдите «Макросы препроцессора» и удалите написанное в нем «DEBUG = 1».

и все, теперь вы не увидите никаких журналов в своей консоли.

person Funny    schedule 24.01.2014