2017-01-16 18 views
0

我想發送的NSLog到一個文件中的斯威夫特3模擬器,IOS 10.2運行並沒有什麼正在生產重定向的NSLog在斯威夫特文件不工作

How to NSLog into a file

func redirectConsoleLogToDocumentFolder() { 
    let file = "file.txt" 
    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { 

     let logPath = dir.appendingPathComponent(file).absoluteString 
     print("log:\(logPath)") 
     freopen(logPath, "a+", stderr) 
    } 
    NSLog("print nslog") 
} 

輸出

~/Library/Developer/CoreSimulator/Devices/A7B717-3ED8-493A-9778-C594AF9FF446/data/Containers/Data/Application/B0386-64BB-46EB-9BF2-65209FC748CD/Documents/file.txt 

唯一的影響是輸出不再打印到控制檯。

我已經試過

freopen(logPath.cString(using: .utf8), "a+", stderr) 

和其他各種組合

我沒有問題寫有我收到的路徑的文件,所以沒有什麼不妥

我預期在路徑中看到一個名爲file.txt的文件,並在文件中包含「print nslog」。我曾嘗試創建文件,但沒有成功。

回答

7

URLabsoluteString屬性產生一個URL字符串,例如,

 
    file:///path/to/file.txt 

這不適合作爲參數freopen()的參數。 要獲取文件路徑作爲一個字符串,使用path代替:

let logPath = dir.appendingPathComponent(file).path 

更好,使用專用的方法將一個網址路徑傳遞到系統調用:

let logFileURL = dir.appendingPathComponent(file) 
logFileURL.withUnsafeFileSystemRepresentation { 
    _ = freopen($0, "a+", stderr) 
}