Forum: Ruby output delay

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
35523c3eb58d186f5c040f57a23ee8a6?d=identicon&s=25 Daniel Shackelford (Guest)
on 2006-06-07 23:08
(Received via mailing list)
Howdy,

I am doing some log processing (cross referencing multiple logs, and
activating triggers based on the results) and printing the results to
stdout for testing while writing to a file at the same time.  The
symptom that I am seeing is that the output to stdout is immediate,
while tailing the file with the same output seems to be one entry
behind.  Here is what the code looks like:

                    logRoot = '/var/log/'
                    blockLog = File.open(logRoot + 'block.log', "a+")
                    result = searchFW(src,dst,path,time)   # does a
search for the needed info in the log, and returns the matching lines
                    unless result.empty?
                        token = parseFW(result)                  #  runs
the results through a parser that pulls out the relevant bits
                        blockLog << date+"+"+token+"+"+url+"\n"
                        p date+"+"+token+"+"+url
                    end

I am a bit green, so my code bits may look clunky.  I am using ruby 1.8
on FreeBSD, and the above code is in the depths of a loop that tails a
log file.  Actually, the code above is a compressed view with the
relevant parts.  Variables/objects are declared further up in the tree.
31af45939fec7e3c4ed8a798c0bd9b1a?d=identicon&s=25 Matthew Smillie (notmatt)
on 2006-06-08 00:28
(Received via mailing list)
On Jun 7, 2006, at 22:06, Daniel Shackelford wrote:

> Howdy,
>
> I am doing some log processing (cross referencing multiple logs,
> and activating triggers based on the results) and printing the
> results to stdout for testing while writing to a file at the same
> time.  The symptom that I am seeing is that the output to stdout is
> immediate, while tailing the file with the same output seems to be
> one entry behind.  Here is what the code looks like:

This is the result of buffered output, one simple change ought to fix
it up:


>
>                    logRoot = '/var/log/'
>                    blockLog = File.open(logRoot + 'block.log', "a+")
>                    result = searchFW(src,dst,path,time)   # does a
> search for the needed info in the log, and returns the matching lines
>                    unless result.empty?
>                        token = parseFW(result)                  #
> runs the results through a parser that pulls out the relevant bits
>                        blockLog << date+"+"+token+"+"+url+"\n"
                          blockLog.flush
35523c3eb58d186f5c040f57a23ee8a6?d=identicon&s=25 Daniel Shackelford (Guest)
on 2006-06-08 15:02
(Received via mailing list)
Thank you, that was exactly what I needed.  Last night as I was trying
to sleep I was thinking about the fact that it was an I/O and would
probably need to be flushed, and sure enough.

Matthew Smillie wrote:
>> behind.  Here is what the code looks like:
>>                    unless result.empty?
>>                        token = parseFW(result)                  #
>> runs the results through a parser that pulls out the relevant bits
>>                        blockLog << date+"+"+token+"+"+url+"\n"
>                          blockLog.flush
>>                        p date+"+"+token+"+"+url
>>                    end
>
>
>
>


--
Daniel Shackelford
Systems Administrator
Technology Services
Spring Arbor University
517 750-6648

"For even the Son of Man did not come to be served, but to serve, and to
give His life a ransom for many"
Mark 10:45
This topic is locked and can not be replied to.