From 88429242ddf82c03509ca66a687d9fb1534d2446 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Wed, 22 May 2019 11:46:26 -0400 Subject: Add --follow to journald ctr logging Signed-off-by: Peter Hunt --- libpod/container_log.go | 3 --- libpod/container_log_linux.go | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 5 deletions(-) (limited to 'libpod') 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 +} -- cgit v1.2.3-54-g00ecf