func (instance *Instance) tailFile(name, filename string, stopCh chan bool, tracker storage.Tracker) { var err error var location *tail.SeekInfo var limit int64 var shouldInitialize bool pub := logyard.Broker.NewPublisherMust() defer pub.Stop() if tracker.IsChildNodeInitialized(instance.getShortDockerId(), filename) { offset := tracker.GetFileCachedOffset(instance.getShortDockerId(), filename) location = &tail.SeekInfo{offset, os.SEEK_SET} } else { limit, err = instance.getReadLimit(pub, name, filename) location = &tail.SeekInfo{-limit, os.SEEK_END} shouldInitialize = true } if err != nil { log.Warn(err) instance.SendTimelineEvent("WARN -- %v", err) return } rateLimiter := GetConfig().GetLeakyBucket() t, err := tail.TailFile(filename, tail.Config{ MaxLineSize: GetConfig().MaxRecordSize, MustExist: true, Follow: true, Location: location, ReOpen: false, Poll: false, RateLimiter: rateLimiter}) // IMPORTANT: this registration happens everytime app restarts if shouldInitialize { tracker.InitializeChildNode(instance.getShortDockerId(), filename, INITIAL_OFFSET) } if err != nil { log.Warnf("Cannot tail file (%s); %s", filename, err) instance.SendTimelineEvent("ERROR -- Cannot tail file (%s); %s", name, err) return } instance.readFromTail(t, pub, name, stopCh, filename, tracker) }