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.
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
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 S. 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 S.
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 forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.