summaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
Diffstat (limited to 'libpod')
-rw-r--r--libpod/container_log.go3
-rw-r--r--libpod/container_log_linux.go32
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
+}