summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hunt <pehunt@redhat.com>2019-05-22 11:46:26 -0400
committerPeter Hunt <pehunt@redhat.com>2019-05-28 11:14:08 -0400
commit88429242ddf82c03509ca66a687d9fb1534d2446 (patch)
tree5905a76af7396be8db361bd676349f243f5f8aae
parent51bdf29f0493827ce3eb278a193d0a7402add896 (diff)
downloadpodman-88429242ddf82c03509ca66a687d9fb1534d2446.tar.gz
podman-88429242ddf82c03509ca66a687d9fb1534d2446.tar.bz2
podman-88429242ddf82c03509ca66a687d9fb1534d2446.zip
Add --follow to journald ctr logging
Signed-off-by: Peter Hunt <pehunt@redhat.com>
-rw-r--r--docs/podman-logs.1.md2
-rw-r--r--libpod/container_log.go3
-rw-r--r--libpod/container_log_linux.go32
-rw-r--r--test/e2e/.logs_test.go.swpbin20480 -> 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
deleted file mode 100644
index 4a4788beb..000000000
--- a/test/e2e/.logs_test.go.swp
+++ /dev/null
Binary files differ