Ограничить вывод NSLog в Objective- C - PullRequest
0 голосов
/ 03 апреля 2020

В моем приложении я реализовал NSLog (stderr) для вывода во внешний текстовый файл. Тем не менее, множество ненужных выходных данных из импортированных фреймворков go также попадает в журнал, что затрудняет чтение журнала при отладке.

Я бы хотел отфильтровать журнал / stderr, чтобы он не выводил строки, содержащие указанные c символы (например, «FMDatabase» и т. д.).

Вот несколько примеров использования «pipe», как в ссылке ниже. Однако я не смог найти реальный пример использования фильтра для управления выводом stderr.

Есть идеи? Спасибо!

https://qiita.com/hotpepsi/items/5be256eb7e915253ddff

#import <UIKit/UIKit.h>

#ifdef DEBUG
static dispatch_source_t dispatchSource;

@interface StdErrFilter : NSObject
@end

@implementation StdErrFilter
+ (void)load
{
    NSPipe *pipe = [NSPipe new];
    int stdErrHandle = dup(STDERR_FILENO);
    dup2(pipe.fileHandleForWriting.fileDescriptor, STDERR_FILENO);
    dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ,
                                            pipe.fileHandleForReading.fileDescriptor,
                                            0,
                                            dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0));
    dispatch_source_set_event_handler(dispatchSource, ^{
        NSData *data = pipe.fileHandleForReading.availableData;
        const char *bytes = data.bytes;
        size_t length = 0, remainBytes;
        for (remainBytes = data.length; remainBytes > 0; remainBytes -= length) {
            const char *lf = strchr(bytes, '\n');
            length = lf ? lf - bytes + 1 : remainBytes;

            // TODO: filter

            write(stdErrHandle, bytes, length);
            bytes += length;
        }
    });
    dispatch_resume(dispatchSource);
}
@end
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...