Есть несколько вариантов, которые вы можете использовать с помощью 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"
, если вы хотите добавить существующий файл.
Спасибо за ответ Аарон! Я не понял, как бы сделать фильтрацию :(Мне нужно перенаправить на '/ dev/null' каждую строку, содержащую' LevelIDC'. В противном случае я хочу, чтобы она была в журнале как обычно. – Matheus
@Matheus Я думаю, вы могли бы сделайте такой подход: (1) вызовите 'startFilter()' в файл журнала, (2) создайте еще одну функцию, которая постоянно читает файл, (3) если в файле есть новая строка, не содержащая 'LevelIDC', stopFilter() ', распечатайте его еще раз, затем снова вызовите' startFilter() ' –