diff options
Diffstat (limited to 'libpod')
-rw-r--r-- | libpod/container_log.go | 3 | ||||
-rw-r--r-- | libpod/container_log_linux.go | 32 |
2 files changed, 30 insertions, 5 deletions
diff --git a/libpod/container_log.go b/libpod/container_log.go index c893ccad9..374e5a1fc 100644 --- a/libpod/container_log.go +++ b/libpod/container_log.go @@ -63,9 +63,6 @@ func (c *Container) ReadLog(options *LogOptions, logChannel chan *LogLine) error // TODO Skip sending logs until journald logs can be read // TODO make this not a magic string if c.LogDriver() == JournaldLogging { - if options.Follow { - return errors.Errorf("The follow option with journald logging is not currently supported") - } return c.readFromJournal(options, logChannel) } return c.readFromLogFile(options, logChannel) diff --git a/libpod/container_log_linux.go b/libpod/container_log_linux.go index 3b7945e0c..e549673a6 100644 --- a/libpod/container_log_linux.go +++ b/libpod/container_log_linux.go @@ -57,6 +57,20 @@ func (c *Container) readFromJournal(options *LogOptions, logChannel chan *LogLin r.Rewind() } + if options.Follow { + go func() { + follower := FollowBuffer{logChannel} + err := r.Follow(nil, follower) + if err != nil { + logrus.Debugf(err.Error()) + } + r.Close() + options.WaitGroup.Done() + return + }() + return nil + } + go func() { bytes := make([]byte, bufLen) // /me complains about no do-while in go @@ -84,8 +98,8 @@ func (c *Container) readFromJournal(options *LogOptions, logChannel chan *LogLin func journalFormatter(entry *journal.JournalEntry) (string, error) { usec := entry.RealtimeTimestamp - timestamp := time.Unix(0, int64(usec)*int64(time.Microsecond)) - output := timestamp.Format(logTimeFormat) + " " + tsString := time.Unix(0, int64(usec)*int64(time.Microsecond)).Format(logTimeFormat) + output := fmt.Sprintf("%s ", tsString) priority, ok := entry.Fields["PRIORITY"] if !ok { return "", errors.Errorf("no PRIORITY field present in journal entry") @@ -113,3 +127,17 @@ func journalFormatter(entry *journal.JournalEntry) (string, error) { output += strings.TrimSpace(msg) return output, nil } + +type FollowBuffer struct { + logChannel chan *LogLine +} + +func (f FollowBuffer) Write(p []byte) (int, error) { + bytestr := string(p) + logLine, err := newLogLine(bytestr) + if err != nil { + return -1, err + } + f.logChannel <- logLine + return len(p), nil +} |