diff options
-rw-r--r-- | docs/podman-logs.1.md | 2 | ||||
-rw-r--r-- | libpod/container_log.go | 3 | ||||
-rw-r--r-- | libpod/container_log_linux.go | 32 | ||||
-rw-r--r-- | test/e2e/.logs_test.go.swp | bin | 20480 -> 0 bytes |
4 files changed, 30 insertions, 7 deletions
diff --git a/docs/podman-logs.1.md b/docs/podman-logs.1.md index 6d5be373b..ce5d890ce 100644 --- a/docs/podman-logs.1.md +++ b/docs/podman-logs.1.md @@ -23,8 +23,6 @@ Note: If you are following a container which is removed `podman container rm` or removed on exit `podman run --rm ...`, then there is a chance the the log file will be removed before `podman logs` reads the final content. -Also note: **--follow** is not currently supported when the container's log driver is journald - **--latest, -l** Instead of providing the container name or ID, use the last created container. If you use methods other than Podman 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 +} diff --git a/test/e2e/.logs_test.go.swp b/test/e2e/.logs_test.go.swp Binary files differdeleted file mode 100644 index 4a4788beb..000000000 --- a/test/e2e/.logs_test.go.swp +++ /dev/null |