Как транслировать (большой) файл журнала?

Когда выполняется автоматизированное тестирование, я не могу подключиться к тестирующему компьютеру и проверить файл журнала, чтобы проверить ход тестирования, потому что я прервал бы тестирование. Я могу сопоставить жесткий диск и проверить файл таким образом, но я хочу добавить новую функцию в мое приложение 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, например, первый хит:

https://github.com/simulacre/sinatra-websocket

Другие вопросы по тегам