package main import ( "fmt" "github.com/ActiveState/tail" "flag" "os" ) func args2config() tail.Config { config := tail.Config{Follow: true} flag.IntVar(&config.Location, "n", 0, "tail from the last Nth location") flag.BoolVar(&config.Follow, "f", false, "wait for additional data to be appended to the file") flag.BoolVar(&config.ReOpen, "F", false, "follow, and track file rename/rotation") flag.Parse() if config.ReOpen { config.Follow = true } return config } func main() { config := args2config() if flag.NFlag() < 1 { fmt.Println("need one or more files as arguments") os.Exit(1) } done := make(chan bool) for _, filename := range flag.Args() { go tailFile(filename, config, done) } for _, _ = range flag.Args() { <-done } } func tailFile(filename string, config tail.Config, done chan bool) { defer func() { done <- true }() t, err := tail.TailFile(filename, config) if err != nil { fmt.Println(err) return } for line := range t.Lines { fmt.Println(line.Text) } err = t.Wait() if err != nil { fmt.Println(err) } }