Micro log fixes (#1570)
This commit is contained in:
		| @@ -251,6 +251,18 @@ func (r *runtime) Create(s *Service, opts ...CreateOption) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // exists returns whether the given file or directory exists | ||||
| func exists(path string) (bool, error) { | ||||
| 	_, err := os.Stat(path) | ||||
| 	if err == nil { | ||||
| 		return true, nil | ||||
| 	} | ||||
| 	if os.IsNotExist(err) { | ||||
| 		return false, nil | ||||
| 	} | ||||
| 	return true, err | ||||
| } | ||||
|  | ||||
| // @todo: Getting existing lines is not supported yet. | ||||
| // The reason for this is because it's hard to calculate line offset | ||||
| // as opposed to character offset. | ||||
| @@ -265,18 +277,41 @@ func (r *runtime) Logs(s *Service, options ...LogsOption) (LogStream, error) { | ||||
| 		stream:  make(chan LogRecord), | ||||
| 		stop:    make(chan bool), | ||||
| 	} | ||||
| 	t, err := tail.TailFile(logFile(s.Name), tail.Config{Follow: true, Location: &tail.SeekInfo{ | ||||
| 		Whence: 2, | ||||
| 		Offset: 0, | ||||
|  | ||||
| 	fpath := logFile(s.Name) | ||||
| 	if ex, err := exists(fpath); err != nil { | ||||
| 		return nil, err | ||||
| 	} else if !ex { | ||||
| 		return nil, fmt.Errorf("Log file %v does not exists", fpath) | ||||
| 	} | ||||
|  | ||||
| 	whence := 2 | ||||
| 	// Multiply by length of an average line of log in bytes | ||||
| 	offset := -1 * lopts.Count * 200 | ||||
|  | ||||
| 	t, err := tail.TailFile(logFile(s.Name), tail.Config{Follow: lopts.Stream, Location: &tail.SeekInfo{ | ||||
| 		Whence: whence, | ||||
| 		Offset: int64(offset), | ||||
| 	}, Logger: tail.DiscardingLogger}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	ret.tail = t | ||||
| 	go func() { | ||||
| 		for line := range t.Lines { | ||||
| 			ret.stream <- LogRecord{Message: line.Text} | ||||
| 		for { | ||||
| 			select { | ||||
| 			case line, ok := <-t.Lines: | ||||
| 				if !ok { | ||||
| 					ret.Stop() | ||||
| 					return | ||||
| 				} | ||||
| 				ret.stream <- LogRecord{Message: line.Text} | ||||
| 			case <-ret.stop: | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	}() | ||||
| 	return ret, nil | ||||
| } | ||||
| @@ -301,16 +336,17 @@ func (l *logStream) Error() error { | ||||
| func (l *logStream) Stop() error { | ||||
| 	l.Lock() | ||||
| 	defer l.Unlock() | ||||
| 	// @todo seems like this is causing a hangup | ||||
| 	//err := l.tail.Stop() | ||||
| 	//if err != nil { | ||||
| 	//	return err | ||||
| 	//} | ||||
|  | ||||
| 	select { | ||||
| 	case <-l.stop: | ||||
| 		return nil | ||||
| 	default: | ||||
| 		close(l.stop) | ||||
| 		close(l.stream) | ||||
| 		err := l.tail.Stop() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user