2016-09-01 3 views
3

Я вызываю метод AVFoundation, который регистрирует много данных до stdout, и нет возможности отключить это отключение.Данные процесса, отправляемые в stdout

Возможно ли написать что-то вроде промежуточного программного обеспечения для обработки данных до, отправив его stdout?

Что-то вроде этого псевдокода:

Process.beforePrint(data => { 
    if (data !== blackListedData) { 
     print(data); 
    } 
}); 

ответ

3

Есть несколько вариантов, которые вы можете использовать с помощью stdio функции. Вот простой один, который перенаправляет стандартный вывод в файл журнала:

class StdoutFilter { 
    let path: String = { 
     let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
     return (paths[0] as NSString).stringByAppendingPathComponent("swift.log") 
    }() 

    func startFilter() { 
     freopen(path, "w", stdout) 
    } 

    func stopFilter() { 
     fclose(stdout) 
    } 
} 

Вы можете использовать эту тривиальную реализацию так:

let filter = StdoutFilter() 

print("This goes to stdout…") 

filter.startFilter() 

print("This gets logged to the file…") 
print("Put your AVFoundation stuff here.") 

filter.stopFilter() 

print("And we're back to normal!") 

Это может быть изменен в течение нескольких очевидных способов. Например, вы можете перенаправить вывод на /dev/null. Вы также можете попробовать контролировать файл и применять предикат, чтобы определить, должен ли фильтр запускаться или останавливаться, но я думаю, что это сложнее, чем у меня есть время на данный момент.

Замечание: "w" в функции startFilter() будет перезаписывать файл, если он существует. Используйте "a", если вы хотите добавить существующий файл.

+0

Спасибо за ответ Аарон! Я не понял, как бы сделать фильтрацию :(Мне нужно перенаправить на '/ dev/null' каждую строку, содержащую' LevelIDC'. В противном случае я хочу, чтобы она была в журнале как обычно. – Matheus

+1

@Matheus Я думаю, вы могли бы сделайте такой подход: (1) вызовите 'startFilter()' в файл журнала, (2) создайте еще одну функцию, которая постоянно читает файл, (3) если в файле есть новая строка, не содержащая 'LevelIDC', stopFilter() ', распечатайте его еще раз, затем снова вызовите' startFilter() ' –

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