Reading log files as they're updated in Go

前端 未结 5 1169
刺人心
刺人心 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:03

    I have written a Go package -- github.com/hpcloud/tail -- to do exactly this.

    t, err := tail.TailFile("/var/log/nginx.log", tail.Config{Follow: true})
    for line := range t.Lines {
        fmt.Println(line.Text)
    }
    

    ...

    Quoting kostix's answer:

    in real life files might be truncated, replaced or renamed (because that's what tools like logrotate are supposed to do).

    If a file gets truncated, it will automatically be re-opened. To support re-opening renamed files (due to logrotate, etc.), you can set Config.ReOpen, viz.:

    t, err := tail.TailFile("/var/log/nginx.log", tail.Config{
        Follow: true,
        ReOpen: true})
    for line := range t.Lines {
        fmt.Println(line.Text)
    }
    

    Config.ReOpen is analogous to tail -F (capital F):

     -F      The -F option implies the -f option, but tail will also check to see if the file being followed has been
             renamed or rotated.  The file is closed and reopened when tail detects that the filename being read from
             has a new inode number.  The -F option is ignored if reading from standard input rather than a file.
    

提交回复
热议问题