I have a log file that is constantly growing. How can I watch and parse it via a Ruby script?
The script will parse each new line as it is written to the file and ou
check out file-tail gem
Working on idea of @Qianjigui but not using 100% CPU:
def watch_for(file, pattern)
# Replace -n0 with -n+1 if you want to read from the beginning of file
f = IO.popen(%W[tail -f -n0 #{file}])
loop do
select([f])
while line = f.gets
puts "Found it! #{line}" if line =~ pattern
end
end
end
watch_for('g.txt', /ERROR/)
def watch_for(file, pattern)
f = File.open(file,"r")
f.seek(0,IO::SEEK_END)
while true do
select([f])
line = f.gets
puts "Found it! #{line}" if line=~pattern
end
end
watch_for("g.txt",/ERROR/)
Thanks for the ezpz's idea, using the select method you get get what you want. The select method is listening the IO's stream, read the bytes what comes 'late'.
You can use Kernel#select
in the following way:
def watch_for(file,pattern)
f = File.open(file,"r")
# Since this file exists and is growing, seek to the end of the most recent entry
f.seek(0,IO::SEEK_END)
while true
select([f])
puts "Found it!" if f.gets =~ pattern
end
end
Then call it like:
watch_for("some_file", /ERROR/)
I've elided all error checking and such - you will want to have that and probably some mechanism to break out of the loop. But the basic idea is there.
Poor man's approach for quick stuff:
a Ruby script that does
ARGF.each do |line|
...
Running screen with:
tail -f file | ruby script
If you're on Linux...
tail -f log/development.log | grep "ERROR"
Unless you really wanted it to be a Ruby script for some reason.