Reading log files as they're updated in Go

前端 未结 5 1161
刺人心
刺人心 2020-12-14 14:29

I\'m trying to parse some log files as they\'re being written in Go but I\'m not sure how I would accomplish this without rereading the file again and again while checking f

5条回答
  •  情歌与酒
    2020-12-14 15:00

    A simple example:

    package main
    
    import (
        "bufio"
        "fmt"
        "io"
        "os"
        "time"
    )
    
    func tail(filename string, out io.Writer) {
        f, err := os.Open(filename)
        if err != nil {
            panic(err)
        }
        defer f.Close()
        r := bufio.NewReader(f)
        info, err := f.Stat()
        if err != nil {
            panic(err)
        }
        oldSize := info.Size()
        for {
            for line, prefix, err := r.ReadLine(); err != io.EOF; line, prefix, err = r.ReadLine() {
                if prefix {
                    fmt.Fprint(out, string(line))
                } else {
                    fmt.Fprintln(out, string(line))
                }
            }
            pos, err := f.Seek(0, io.SeekCurrent)
            if err != nil {
                panic(err)
            }
            for {
                time.Sleep(time.Second)
                newinfo, err := f.Stat()
                if err != nil {
                    panic(err)
                }
                newSize := newinfo.Size()
                if newSize != oldSize {
                    if newSize < oldSize {
                        f.Seek(0, 0)
                    } else {
                        f.Seek(pos, io.SeekStart)
                    }
                    r = bufio.NewReader(f)
                    oldSize = newSize
                    break
                }
            }
        }
    }
    
    func main() {
        tail("x.txt", os.Stdout)
    }
    

提交回复
热议问题