diff options
author | Nalin Dahyabhai <nalin@redhat.com> | 2021-08-18 12:13:03 -0400 |
---|---|---|
committer | Nalin Dahyabhai <nalin@redhat.com> | 2021-08-23 17:59:49 -0400 |
commit | 1411fa5f23e3890fe870ec4ffdf2e6f114688030 (patch) | |
tree | ad7a1bec962c33976caedaea123066765ab0fd6d /libpod/container_log_linux.go | |
parent | 6b06e9b77c8191096eeb82ac54c59b894f87da8c (diff) | |
download | podman-1411fa5f23e3890fe870ec4ffdf2e6f114688030.tar.gz podman-1411fa5f23e3890fe870ec4ffdf2e6f114688030.tar.bz2 podman-1411fa5f23e3890fe870ec4ffdf2e6f114688030.zip |
libpod/Container.readFromJournal(): don't skip the first entry
When reading log entries from the journal, don't skip past the first
matching entry after we've positioned the cursor at it.
Make the first blank-line entry that we logged so that the container
would always have at least one log entry for us to find (until it gets
vacuumed out, at least) a fake history entry, so that `logs` doesn't
pass it on for display.
CI already has tests that exercise journal-based logging, so
[NO TESTS NEEDED]
Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
Diffstat (limited to 'libpod/container_log_linux.go')
-rw-r--r-- | libpod/container_log_linux.go | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/libpod/container_log_linux.go b/libpod/container_log_linux.go index 748f80fa5..ca1e11ef5 100644 --- a/libpod/container_log_linux.go +++ b/libpod/container_log_linux.go @@ -38,6 +38,8 @@ func (c *Container) initializeJournal(ctx context.Context) error { m["SYSLOG_IDENTIFIER"] = "podman" m["PODMAN_ID"] = c.ID() m["CONTAINER_ID_FULL"] = c.ID() + history := events.History + m["PODMAN_EVENT"] = history.String() return journal.Send("", journal.PriInfo, m) } @@ -89,10 +91,10 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption var cursorError error for i := 1; i <= 3; i++ { cursor, cursorError = journal.GetCursor() - if err != nil { + if cursorError != nil { + time.Sleep(time.Duration(i*100) * time.Millisecond) continue } - time.Sleep(time.Duration(i*100) * time.Millisecond) break } if cursorError != nil { @@ -116,6 +118,7 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption tailQueue := []*logs.LogLine{} // needed for options.Tail doTail := options.Tail > 0 + lastReadCursor := "" for { select { case <-ctx.Done(): @@ -125,18 +128,25 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption // Fallthrough } - if _, err := journal.Next(); err != nil { - logrus.Errorf("Failed to move journal cursor to next entry: %v", err) - return + if lastReadCursor != "" { + // Advance to next entry if we read this one. + if _, err := journal.Next(); err != nil { + logrus.Errorf("Failed to move journal cursor to next entry: %v", err) + return + } } - latestCursor, err := journal.GetCursor() + + // Fetch the location of this entry, presumably either + // the one that follows the last one we read, or that + // same last one, if there is no next entry (yet). + cursor, err = journal.GetCursor() if err != nil { logrus.Errorf("Failed to get journal cursor: %v", err) return } - // Hit the end of the journal. - if cursor == latestCursor { + // Hit the end of the journal (so far?). + if cursor == lastReadCursor { if doTail { // Flush *once* we hit the end of the journal. startIndex := int64(len(tailQueue)-1) - options.Tail @@ -157,8 +167,9 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption journal.Wait(sdjournal.IndefiniteWait) continue } - cursor = latestCursor + lastReadCursor = cursor + // Read the journal entry. entry, err := journal.GetEntry() if err != nil { logrus.Errorf("Failed to get journal entry: %v", err) |