From: Robert Klemme Date: 2009-12-13T20:20:14+09:00 Subject: Re: Question about file management [read] On 12.12.2009 21:05, Panagiotis Atmatzidis wrote: > A salut to the list, > > I need read info from a file, extract the info that I want which is the date and IP and dump them into a database (mysql). > > However, this file gets constantly updated, sits on /var/log/. > > Until now I have used just the file.open and file.read methods. However, I feel that both ways are not suitable for what I want to do, because I will need to make a selection between old and new entries every time my script reads the file to extract info. > > What is the *standard* (or best) way to manage this situation? > > Here is the class which reads the file: > > class ReadIPs > def self.ip(log) > file = File.open(log) Ha! There you are not using block form of File.open and you do not have the #close in ensure! :-) > file.each_line do |line| > if line.include?("Ban") > a = line.split(" ") > date = a[0] > ip = a[6] > puts "date: #{date} IP: #{ip}" > end > end > file.close > end > end > > I use File.open now but I should use something like File.append or similar? Note that I will never write to this file, it's just the file that contains the info. Every time a new line appears that contains the word "Ban" I want to trigger this... > > Best regards I can't test it right now but this might be an option. File.open log do |io| loop do io.each do |line| # whatever... end # v2: pos = io.tell sleep 10 # whatever interval is appropriate # v1: io.seek(0, IO::SEEK_SET) # v2: io.seek(pos, IO::SEEK_CUR) end end Maybe you have to do one of the variants to clear eof flag: v1: seek to offset 0 of current position v2: fetch the position before the sleep and then seek to that absolute position Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/