我正在尝试找到一种有效的方法来查看网页上的服务器日志。我不介意建造宝石;我只是想找出最好的方法来做到这一点。
有没有办法让流对 Ruby(不是任何框架)和浏览器的文件保持打开状态?还是必须通过每 x 秒轮询一次文件来完成?
这是一个常见的问题。您不能真正“轻松”地流式传输到浏览器。最后,您必须在客户端有一些小的 javascript 位来处理和显示传入的数据,并在服务器端有一个单独的服务器进程来读取文件并将数据泵回客户端。
今天的大多数浏览器都支持 WebSocket,它允许浏览器客户端和服务器端的任何服务之间进行双向直接通信。所以这就是我会使用的。
在 WebSockets 之前,您有各种使用 AJAX 长轮询或其他变通方法的黑客攻击。但是今天我想说 WebSockets 是要走的路。
有几个用于 ruby 的 WebSocket 库,这使得在服务器端和客户端都更容易设置这样的东西:
最佳 Ruby on Rails WebSocket 工具
Google - Ruby Websockets
另外,为了获得灵感,您可能想看看您正在尝试做的事情的 node.js 实现:
frontail(1) – 浏览器中的 tail -F 输出
它使用Socket.IO进行通信实现。
最简单的方法是使用Sinatra::Streaming。此扩展是Sinatra::Contrib
项目的一部分。也试试Rack::Stream
为了好玩,我创建了一个Rails 引擎调用 live_logs ,它使用SourceEvent javascript 和ActionController::Live (Rails >= 4)打包接口和日志流。
您可以直接使用它或提取您需要的一些机制。
请记住,它与 Heroku 不兼容(一段时间后关闭连接,因此文件日志位置丢失)