From 63ef7135d957d396b87727b6151f9caf3266366d Mon Sep 17 00:00:00 2001
From: Nalin Dahyabhai <nalin@redhat.com>
Date: Fri, 12 Nov 2021 11:15:18 -0500
Subject: journald logs: keep reading until the journal's end

When reading logs from the journal, keep going after the container
exits, in case it gets restarted.

Events logged to the journal via the normal paths don't include
CONTAINER_ID_FULL, so don't bother adding it to the "history" event we
use to force at least one entry for the container to show up in the log.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
---
 libpod/container_log_linux.go | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

(limited to 'libpod')

diff --git a/libpod/container_log_linux.go b/libpod/container_log_linux.go
index 4029d0af7..c5e145b7d 100644
--- a/libpod/container_log_linux.go
+++ b/libpod/container_log_linux.go
@@ -37,9 +37,11 @@ func (c *Container) initializeJournal(ctx context.Context) error {
 	m := make(map[string]string)
 	m["SYSLOG_IDENTIFIER"] = "podman"
 	m["PODMAN_ID"] = c.ID()
-	m["CONTAINER_ID_FULL"] = c.ID()
 	history := events.History
 	m["PODMAN_EVENT"] = history.String()
+	container := events.Container
+	m["PODMAN_TYPE"] = container.String()
+	m["PODMAN_TIME"] = time.Now().Format(time.RFC3339Nano)
 	return journal.Send("", journal.PriInfo, m)
 }
 
@@ -89,6 +91,7 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption
 	// exponential backoff.
 	var cursor string
 	var cursorError error
+	var containerCouldBeLogging bool
 	for i := 1; i <= 3; i++ {
 		cursor, cursorError = journal.GetCursor()
 		hundreds := 1
@@ -172,7 +175,7 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption
 					doTailFunc()
 				}
 				// Unless we follow, quit.
-				if !options.Follow {
+				if !options.Follow || !containerCouldBeLogging {
 					return
 				}
 				// Sleep until something's happening on the journal.
@@ -201,11 +204,14 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption
 					logrus.Errorf("Failed to translate event: %v", err)
 					return
 				}
-				if status == events.Exited {
+				switch status {
+				case events.History, events.Init, events.Start, events.Restart:
+					containerCouldBeLogging = true
+				case events.Exited:
+					containerCouldBeLogging = false
 					if doTail {
 						doTailFunc()
 					}
-					return
 				}
 				continue
 			}
-- 
cgit v1.2.3-54-g00ecf