2016-09-01 64 views
3

我打電話給AVFoundation方法,它將很多數據記錄到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()' –

相關問題