3

运行自动化测试时,我无法连接到测试计算机并检查日志文件以检查测试进度,因为我会中断测试。我可以通过这种方式映射硬盘并检查文件,但我想向我的 sinatra 应用程序添加新功能。

该应用程序运行测试并显示测试结果,因此我想通过 sintra 添加日志文件的实时流。日志文件甚至可能有 2MB 大,所以我想每次更新日志文件时发送整个文件并不是一个好主意,尽管服务器客户端通信将仅通过 LAN 完成 99%。我还想在 Web 浏览器顶部的日志文件中获取最新的最后一行。

有人可以建议怎么做吗?

我可以想到一个定期进行的 ajax 调用,它将传递给 sinatra 的最后一行收到的行数。如果可用,sinatra 会返回任何更新。

更新

  • 视窗 7 64 位
  • 红宝石 1.9.3p194 (2012-04-20) [i386-mingw32]
  • 西纳特拉 (1.3.3)
  • sinatra-contrib (1.3.1)
  • sinatra-reloader (1.0)
4

2 回答 2

3

您不会说您的测试系统使用什么类型的操作系统,但如果是 Linux 或 Mac OS,您就可以开始使用了。如果不是,而且是 Windows,我真的建议安装一个 telnetd 或 ssh 服务器,以及一个尾部类型的应用程序。

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是要显示的行数。

使用那些你可以打开一个文件来显示,发送一些行,从一个偏移量开始。

在 Sinatra 中,为 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'. Sinatra 网站可以向您展示如何做到这一点。

于 2012-12-14T00:50:57.310 回答
1

这是一个使用“push”的例子,即WebSockets:

最小 Websocket Nodejs 尾部示例

在我看来,AJAX 轮询是解决此类问题的胶带式解决方案。WebSockets 是要走的路,正确完成对系统性能的影响很小。

通过谷歌搜索“websockets sinatra”,您可以搜索 Sinatra 的类似解决方案,例如第一次点击:

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

于 2012-12-14T04:22:48.490 回答