Redirecionar NSLog para Arquivo no Swift não está funcionando

Eu estou tentando enviar NSLog para um arquivo no Swift 3 rodando no Simulator, IOS 10.2 e nada está sendo produzido

Como NSLog em um arquivo

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") } 

Saída

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

O único efeito é que a saída não é mais impressa no console.

eu tentei

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

e várias outras combinações

Eu não tenho problemas para escrever em um arquivo com o caminho que estou recebendo, então não há nada de errado com isso

Eu esperava ver um arquivo criado chamado file.txt no caminho e o arquivo contém “print nslog”. Eu tentei criar o arquivo primeiro sem sucesso.

A propriedade absoluteString de um URL produz uma string de URL, por exemplo

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

que não é adequado como argumento para freopen() . Para obter o caminho do arquivo como uma string, use o path :

 let logPath = dir.appendingPathComponent(file).path 

Melhor, use o método dedicado para passar um caminho de URLs para uma chamada de sistema:

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