Как я могу зафиксировать вывод NSLog в ruby?

У меня есть консольное приложение на Mac, которое выводит код ошибки через NSLog. Как я могу зафиксировать результаты NSLog при запуске консольного приложения в ruby?

Я пробовал такие подходы, как перенаправление stderr, но это не Кажется, это не так.

Хорошо, я отредактирую это, чтобы быть кристально чистым.

У меня есть программа, написанная для MacOS, которая в настоящее время сообщает о своих выводах через NSLog. Во всех смыслах и целях он может просто иметь эту строку в своем main.m файле:

NSLog(@"Hello world!");

Я хочу захватить содержимое этого NSLog. Я не могу изменить саму программу, у меня есть только лог-файлы. Я хочу сделать это в Ruby для тестирования на основе rspec.

Прямо сейчас я не могу использовать редиректы. Любой вид переадресации, например:

 @output = `#{theProgramToTest}`
 puts @output

приводит к отсутствию вывода. Если я сделаю перенаправление stderr, как описано в предыдущем вопросе, на который я ссылался, у меня все равно не будет результата. Итак, как я могу зафиксировать результаты программы? Я не хочу перенаправлять их в файл.


person mmr    schedule 08.07.2013    source источник
comment
Вы должны предоставить нам намного больше информации, показав код и ошибки. Сказать, что это не похоже на трюк, очень расплывчато. Необходимую информацию см. на sscce.org.   -  person the Tin Man    schedule 08.07.2013
comment
Действительно? Прямо сейчас у меня нет возможности взять строки, созданные NSLog, и использовать их в ruby. Это довольно простой вопрос. Ошибок нет.   -  person mmr    schedule 08.07.2013
comment
Проверьте stackoverflow.com/questions/7271528/nslog-into-file. NSLog() обычно пишет в консоль Mac. Возможно, вы могли бы отфильтровать результаты из /private/var/log/system.log или одного из других журналов, но это косвенный путь, когда вы можете перенаправить вывод.   -  person the Tin Man    schedule 08.07.2013
comment
Спасибо, но это бесполезно - я не хочу перенаправлять в файл. Я хочу запустить консольное приложение в скрипте ruby, а затем захватить и обработать строки, которые выходят из приложения. Это не приложение для iOS, и я не хочу использовать файлового посредника. По сути, я хочу обрабатывать вывод как результат любой другой команды оболочки.   -  person mmr    schedule 08.07.2013
comment
Затем изучите возможность использования устройства StringIO. Вы можете внутренне перенаправить $stdio или $stderr для записи в строку, а затем перемотать ее назад и получить доступ к ее содержимому. Вот как мы фиксируем вывод в подпроцессе Ruby, который обычно пытается записать в консоль. Но если это не приложение для IOS, а только командная строка, почему бы не использовать обычный Системный журнал или Логеры классы?   -  person the Tin Man    schedule 08.07.2013
comment
@theTinMan - я пробовал, но это не сработало (как я уже сказал, я пытался перенаправить stderr). Вывод из NSLog выглядит не как stderr или stdio, а как-то иначе. Что ж, я использовал методы, описанные в вопросе, на который я ссылался; если нет другого подхода? Кроме того, само приложение является консольным приложением для Mac, а не приложением для iOS. Он написан на Objective-C, и мне нужно зафиксировать его вывод для целей тестирования.   -  person mmr    schedule 08.07.2013


Ответы (1)


Может это поможет:

require 'stringio'

str_stdout, str_stderr = (1..2).map{ StringIO.new }

puts "redirecting outputs"
old_stdout, old_stderr = $stdout, $stderr
$stdout, $stderr = str_stdout, str_stderr

STDOUT.puts "This is written to the old STDOUT"
STDERR.puts "This is written to the old STDERR"

$stdout.puts "This is written to str_stdout"
$stderr.puts "This is written to str_stderr"

puts 'this is output via "puts"'
`date`
`date >&2` # this is output to stderr

STDOUT.puts "resetting STDOUT and STDERR"

$stdout, $stderr = old_stdout, old_stderr

str_stdout.rewind
str_stderr.rewind

puts str_stdout.read
puts str_stderr.read

Что выводит:

redirecting outputs
This is written to the old STDOUT
This is written to the old STDERR
Mon Jul  8 21:51:19 MST 2013
resetting STDOUT and STDERR
This is written to str_stdout
this is output via "puts"
This is written to str_stderr

Пошагово, используя отладчик или PRY, чтобы увидеть, когда происходят различные выходные данные.

person the Tin Man    schedule 09.07.2013