我目前可以向我的rails控制器发出请求,并使用send_file下载我的production.log文件。该文件已经变得庞大,我很少需要整个文件,因此我只想下载部分文件,如最后的20k行。有没有办法在不读取最后n行并将其写入另一个文件然后发送新创建的文件的情况下执行此操作?
这是我目前的代码:
def download_production_log
send_file("#{Rails.root}/log/production.log")
end
答案 0 :(得分:2)
答案 1 :(得分:1)
如果没有阅读最后n行,有没有办法做到这一点......
是的,您不需要将最后n行保存到文件中来提供服务。出于性能原因,您可能不希望 。
诀窍是:如何在不读取整个文件的情况下确定最后n行是什么?这是不可能的,不是没有一些扫描。如果线条是固定大小的,那就是另一个故事。但事实上,最简单的方法(在我看来)是打开文件并只读取最后64kb的数据(或者你需要的任何数量)。
这一大块数据将在某个日志行的中间开始,这是一个非常好的变化。因此,您只需丢弃此数据块的头部,直到(并包括)第一个换行符。剩下的是整个日志行。不完全是20k,但是相似(如果你计算你的平均日志行长度并用它来计算一个块读取的大小)。
然后你可以使用rails' send_data
将该块发送为真实文件。