Você precisaria mesclar STDERR
a STDOUT
. Diga:
./AppName > test.txt 2>&1
e você veria a saída em test.txt
.
Eu estou tentando salvar a saída de um aplicativo que eu escrevi. Quando tento salvar a saída redirecionando o stdout, o arquivo resultante é em branco.
Isso é o que estou digitando no Terminal.app (OS X 10.9.2):
./AppName > test.txt
O aplicativo envia o texto por meio de um NSLog ().
Eu recebo a saída NSLog () no Terminal.app, mas o arquivo text.txt resultante está em branco. Eu li que posso precisar executar o aplicativo substituindo ./ pelo caminho do arquivo:
appPath > text.txt
A mesma coisa acontece.
Alguém poderia me explicar qual é o problema?
O NSLog () registra no recurso Apple System Log (ASL), não stdout ou stderr.
Acesse o fluxo de logs "Todas as Mensagens" no Console.app ou digite syslog
no Terminal. Além disso, você pode configurar filtros para obter o ASL para enviar todas as mensagens de log do seu aplicativo para um arquivo de texto específico. Veja as páginas de manual para ASL, syslog, etc.
Primeiro, algumas informações básicas:
Por padrão, um programa normal do UNIX é iniciado com dois descritores de arquivo: StdOut e StdErr.
StdOut é feito através do descritor de arquivo número 1.
O StdErr é feito através do descritor de arquivo número 2.
Redirecionar saída padrão é feito via 1>
. Exemplo ./App 1> my_log.txt
O redirecionamento do erro padrão é feito via 2>
. Exemplo ./App 2> my_errors.txt
( >
e 1>
são iguais. Uma é apenas uma notação mais curta)
Isso permite coisas úteis, como apenas registrar erros, ou registrar a saída normal em um arquivo e os erros em um arquivo diferente. Ou o caso muito útil de registrar a saída normal em um arquivo e ainda obter erros exibidos na tela.
Substituir ./Appname pelo caminho completo do arquivo não fará diferença. Um inicia o aplicativo a partir do diretório atual, um especifica o caminho completo para o aplicativo. Nenhum influencia os descritores de arquivos.
Agora finalmente chegamos à resposta para sua pergunta:
O que você deseja fazer para registrar a saída de NSlog (). Para fazer isso, você primeiro descobre onde o nslog está gravando.
De acordo com essa é uma pergunta em nosso site StackOverflow NSLog do sistersite para o ASL (Versão da Apple do syslog) e para consolar.
Assim, você quer ler a saída do log do sistema ou alterar a saída do log para um local onde você possa facilmente interceptá-lo. Por exemplo. com freopen([path cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
Vários métodos sobre como fazer isso são respondidos no [so] post ao qual eu fiz o link. Se você adicionar mais detalhes à sua postagem (por exemplo, se estiver modificando o aplicativo permitido?), Posso responder com mais detalhes.