From: Panagiotis Atmatzidis Date: 2009-12-13T22:37:24+09:00 Subject: Re: Question about file management [read] -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hello, On 13 Δεκ 2009, at 1:20 μ.μ., Robert Klemme wrote: > 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! :-) I don't understand what do you mean by '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 Oh, this solutions, might work but I think that it's a bit overcomplicated for me. I did not used IO and "seek" yet... I found online [1] a few examples but I did not had the time to test them. Maybe something like: file = File.open(path, File::WRONLY|File::APPEND) Will do. > -- > remember.guy do |as, often| as.you_can - without end > http://blog.rubybestpractices.com/ [1] http://pleac.sourceforge.net/pleac_ruby/fileaccess.html Panagiotis (atmosx) Atmatzidis email: atma@convalesco.org URL: http://www.convalesco.org GnuPG ID: 0xFC4E8BB4 gpg --keyserver x-hkp://pgp.mit.edu --recv-keys 0xFC4E8BB4 - -- The wise man said: "Never argue with an idiot. They bring you down to their level and beat you with experience." -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.12 (Darwin) iEYEARECAAYFAksk7g0ACgkQrghUb/xOi7Q+LwCdGmvHDHouNAz5lLSd4H84M/1F +csAn398ysHU8qJc4vVTGtpcjHzRHX2k =pOA2 -----END PGP SIGNATURE-----