如何流式传输(大)日志文件?
Posted
技术标签:
【中文标题】如何流式传输(大)日志文件?【英文标题】:How to stream a (big) log file? 【发布时间】:2012-12-14 00:26:37 【问题描述】:当自动化测试运行时,我无法连接到测试计算机并检查日志文件以检查测试进度,因为我会中断测试。我可以通过这种方式映射硬盘并检查文件,但我想向我的 sinatra 应用程序添加新功能。
应用程序运行测试并显示测试结果,因此我想通过 sintra 添加日志文件的实时流。日志文件甚至可能有 2MB 大,所以我想每次更新日志文件时发送整个文件并不是一个好主意,尽管服务器客户端通信将仅通过 LAN 完成 99%。我还想在 Web 浏览器顶部获取日志文件中最新的最后一行。
有人能建议怎么做吗?
我可以想到一个定期进行的 ajax 调用,它会将最后收到的行号传递给 sinatra。如果可用,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)【问题讨论】:
您基本上需要一个推送代理将添加到日志文件的新行传输到您的 Sinatra 应用程序,以便可以重新显示给各种客户端,对吧?您有哪些数据库或存储选项? @tadman:是的,你说得对,我想要一个推动者。不确定我是否理解您的问题,但我没有使用任何数据库。 【参考方案1】:您不会说您的测试系统使用什么类型的操作系统,但如果是 Linux 或 Mac 操作系统,您就可以开始使用了。如果不是,而且是 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 网站可以向您展示如何做到这一点。
【讨论】:
嗯,我没有考虑过这种解决方案,尤其是当辛特拉位于 Windows7 上时。我想这可能是最好的解决方案,因为它的性能。但我还是想知道如何实现“推送器”。 如果您正在测量您的测试机器的性能,您真的不想推,甚至不想拉。要么会从机器上窃取 CPU 周期并人为地更改指标。您可以在测试未运行时收集一些用于拉/推的指标,然后调整您的值以进行补偿,但同样,这不是最好的方法。使用我回答中的代码,您可以控制何时要更新,甚至可以在文件中跳转。当没有请求线路时,主机上不会有额外的负载影响结果。【参考方案2】:这里是一个使用“push”的例子,即WebSockets:
Minimum Websocket Nodejs Tail Example
在我看来,AJAX 轮询是解决此类问题的胶带式解决方案。 WebSockets 是要走的路,正确完成对系统性能的影响很小。
通过谷歌搜索“websockets sinatra”,您可以搜索 Sinatra 的类似解决方案,例如第一次点击:
https://github.com/simulacre/sinatra-websocket
【讨论】:
以上是关于如何流式传输(大)日志文件?的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop MapReduce 流式传输 - 确保我已处理所有日志文件的最佳方法
AWS Elastic Beanstalk:将容器日志流式传输到 CloudWatch 问题
如何使用预定义的 GitLab CI 变量和流式传输到 GitLab Pipeline 日志的 Tekton 日志直接从 GitLab CI 触发 Tekton Pipeline