我想监视由另一个程序不断更新的日志文件。我想每隔10分钟读取一次日志文件,如何实现呢?是否可以每次只读取更新的内容?
答案 0 :(得分:3)
假设仅附加了日志文件,您可以在关闭日志文件之前将其保存到原来的位置,并在重新打开时恢复该位置。使用chan tell
保存位置,并使用chan seek
恢复位置。
proc processLogLine {line} {
# Write this yourself...
puts "got log line '$line'"
}
proc readLogTail {logfile position} {
# Read the tail of the log file from $position, noting where we got to
set f [open $logfile]
chan seek $f $position
set tail [read $f]
set newPosition [chan tell $f]
close $f
# If we read anything at all, handle the log lines within it
if {$newPosition > $position} {
foreach line [split $tail "\n"] {
processLogLine $line
}
}
return $newPosition
}
proc readLogEvery10Minutes {logfile {position 0}} {
set newPosition [readLogTail $logfile $position]
set tenMinutesInMillis [expr {10 * 60 * 1000}]
after $tenMinutesInMillis [list readLogEvery10Minutes $logfile $newPosition]
}
readLogEvery10Minutes /tmp/example.log
vwait forever
注意最后的vwait forever
;运行事件循环,以便实际运行after
计划的计时器回调。如果您已经有一个事件循环转到其他地方(例如,因为这是一个Tk应用程序),那么您不需要vwait forever
。