Как транслировать (большой) файл журнала?
Когда выполняется автоматизированное тестирование, я не могу подключиться к тестирующему компьютеру и проверить файл журнала, чтобы проверить ход тестирования, потому что я прервал бы тестирование. Я могу сопоставить жесткий диск и проверить файл таким образом, но я хочу добавить новую функцию в мое приложение sinatra.
Приложение запускает тесты и отображает результаты тестов, поэтому я хочу добавить поток файла журнала в реальном времени через sintra. Размер файла журнала может быть даже 2 МБ, поэтому я думаю, что не стоит отправлять весь файл каждый раз, когда производится обновление файла журнала, хотя общение с клиентом сервера будет осуществляться на 99% только по локальной сети. Я также хотел бы иметь последнюю последнюю строку из файла журнала в верхней части веб-браузера.
Может кто-нибудь подсказать, как это сделать?
Я могу вспомнить регулярный вызов ajax, который передал бы sinatra номер строки, которая была получена как последняя. И Синатра будет возвращать любое обновление, если доступно.
Обновить
- Windows 7 64 бит
- ruby 1.9.3p194 (2012-04-20) [i386-mingw32]
- синатра (1.3.3)
- sinatra-contrib (1.3.1)
- sinatra-reloader (1.0)
2 ответа
Вы не говорите, какой тип ОС использует ваша система тестирования, но если вы используете Linux или Mac OS, вы готовы к работе. Если нет, и это Windows, я бы очень рекомендовал установить сервер telnetd или ssh и приложение типа tail.
SSH и / или Telnet намного более легковесны, потому что в основном они просто отправляют текст, поэтому они будут меньше влиять на вашу систему тестирования, чем на попытку потоковой передачи файла через HTTP, особенно с решением, которое вы упомянули. Просто откройте сеанс, tail -f
файл, затем запустите тест.
Чтобы реализовать решение с использованием Sinatra, я бы начал с небольшого фрагмента кода:
#!/bin/env ruby
filepath = ARGV.shift
start_line, num_lines = ARGV.map(&:to_i)
File.foreach(filepath) do |li|
case
when $. < start_line
next
when (start_line .. (start_line + num_lines)) === $.
puts li
when $. > (start_line + num_lines)
break
end
end
Сохраните это на диск как display_file_block.rb
и вызвать его с параметрами:
path/to/file start_line lines_to_display
Куда:
path/to/file
очевидно.start_line
является начальной строкой в файле для отображения.lines_to_display
количество строк для отображения.
С их помощью вы можете открыть файл для отображения, отправить несколько строк, начиная со смещения.
В Синатре установите обработчик запроса для GET:
get '/tail' do
path = params['path']
start = params['start']
count = params['count']
`/path/to/display_file_block.rb #{ path } #{ start } #{ count }`
end
Возможно, вы захотите установить content-type
для ответа на 'text/plain'
, Сайт Синатры может показать вам, как это сделать.
Вот пример использования "push", то есть WebSockets:
Пример минимального Websocket Nodejs Tail
По моему мнению, опрос AJAX - это тип решения для такого рода проблем с использованием клейкой ленты. WebSockets - верный путь, и его правильное выполнение будет очень мало влиять на производительность системы.
Погугливая "websockets sinatra", вы можете искать похожие решения для Sinatra, например, первый хит: