在tcl中,如何读取不断更新的日志文件?

时间:2018-04-23 06:43:10

标签: tcl

我想监视由另一个程序不断更新的日志文件。我想每隔10分钟读取一次日志文件,如何实现呢?是否可以每次只读取更新的内容?

1 个答案:

答案 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