func (instance *Instance) readFromTail(t *tail.Tail, pub *zmqpubsub.Publisher, name string, stopCh chan bool, filename string, tracker storage.Tracker) { var err error FORLOOP: for { select { case line, ok := <-t.Lines: if !ok { err = t.Wait() break FORLOOP } currentOffset, err := t.Tell() if err != nil { log.Error(err.Error()) } tracker.Update(instance.getShortDockerId(), filename, currentOffset) instance.publishLine(pub, name, line) case <-stopCh: err = t.Stop() break FORLOOP } } if err != nil { log.Warn(err) instance.SendTimelineEvent("WARN -- Error tailing file (%s); %s", name, err) } log.Infof("Completed tailing %v log for %v", name, instance.Identifier()) }
func (s *FileStorage) Load(e interface{}) error { var err error if _, err = os.Stat(s.file_path); os.IsNotExist(err) { log.Infof("Creating %s since it does not exist", s.file_path) _, err = os.Create(s.file_path) } else { n, err := ioutil.ReadFile(s.file_path) if err != nil { log.Error(err) } p := bytes.NewBuffer(n) dec := gob.NewDecoder(p) err = dec.Decode(e) if err != nil { log.Error(err) } } return err }
func main() { go common.RegisterTailCleanup() major, minor, patch := gozmq.Version() log.Infof("Starting systail (zeromq %d.%d.%d)", major, minor, patch) systail.LoadConfig() nodeid, err := server.LocalIP() if err != nil { common.Fatal("Failed to determine IP addr: %v", err) } log.Info("Host IP: ", nodeid) tailers := []*tail.Tail{} logFiles := systail.GetConfig().LogFiles fmt.Printf("%+v\n", logFiles) if len(logFiles) == 0 { common.Fatal("No log files exist in configuration.") } for name, logfile := range logFiles { t, err := tailLogFile(name, logfile, nodeid) if err != nil { common.Fatal("%v", err) } tailers = append(tailers, t) } server.MarkRunning("systail") for _, tail := range tailers { err := tail.Wait() if err != nil { log.Errorf("Cannot tail [%s]: %s", tail.Filename, err) } } // we don't expect any of the tailers to exit with or without // error. log.Error("No file left to tail; exiting.") os.Exit(1) }