I’ve been working on a log viewer for a Rails app and have found that I need to read around 200 lines of a log file from bottom to top instead of the default top to bottom.
Log files can get quite large, so I’ve already tried and ruled out the IO.readlines(“log_file.log”)[-200..-1] method.
Are there any other ways to go about reading a file backwards in Ruby without the need for a plugin or gem?
The only correct way to do this that also works on enormous files is to read n bytes at a time from the end until you have the number of lines that you want. This is essentially how Unix
tailworks.An example implementation of
IO#tail(n), which returns the lastnlines as anArray:The implementation is a little naive, but a quick benchmark shows what a ridiculous difference this simple implementation can already make (tested with a ~25MB file generated with
yes > yes.txt):The benchmark code:
Of course, other implementations already exist. I haven’t tried any, so I cannot tell you which is best.