From a92b83bca781044b154357b3dfd66821d2b0d776 Mon Sep 17 00:00:00 2001 From: Xueyuan Chen Date: Sat, 26 Feb 2022 23:07:25 +0100 Subject: [PATCH] Add the names flag for pod logs Fixes containers#13261 Signed-off-by: Xueyuan Chen --- cmd/podman/pods/logs.go | 1 + docs/source/markdown/podman-pod-logs.1.md | 4 +++ libpod/container_log_linux.go | 7 +++-- test/e2e/logs_test.go | 33 ++++++++++++++++++++++- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/cmd/podman/pods/logs.go b/cmd/podman/pods/logs.go index 1b00f047ee29..e35b48bed0be 100644 --- a/cmd/podman/pods/logs.go +++ b/cmd/podman/pods/logs.go @@ -87,6 +87,7 @@ func logsFlags(cmd *cobra.Command) { flags.Int64Var(&logsPodOptions.Tail, tailFlagName, -1, "Output the specified number of LINES at the end of the logs.") _ = cmd.RegisterFlagCompletionFunc(tailFlagName, completion.AutocompleteNone) + flags.BoolVarP(&logsPodOptions.Names, "names", "n", false, "Output container names instead of container IDs in the log") flags.BoolVarP(&logsPodOptions.Timestamps, "timestamps", "t", false, "Output the timestamps in the log") flags.SetInterspersed(false) _ = flags.MarkHidden("details") diff --git a/docs/source/markdown/podman-pod-logs.1.md b/docs/source/markdown/podman-pod-logs.1.md index 53aa5d58b3c8..8808530002e5 100644 --- a/docs/source/markdown/podman-pod-logs.1.md +++ b/docs/source/markdown/podman-pod-logs.1.md @@ -28,6 +28,10 @@ chance that the log file will be removed before `podman pod logs` reads the fina Instead of providing the pod name or id, get logs of the last created pod. (This option is not available with the remote Podman client, including Mac and Windows (excluding WSL2) machines) +#### **--names**, **-n** + +Output the container names instead of the container IDs in the log. + #### **--since**=*TIMESTAMP* Show logs since TIMESTAMP. The --since option can be Unix timestamps, date formatted timestamps, or Go duration diff --git a/libpod/container_log_linux.go b/libpod/container_log_linux.go index 6150973ca246..8ae8ff2c0c1e 100644 --- a/libpod/container_log_linux.go +++ b/libpod/container_log_linux.go @@ -1,5 +1,5 @@ -//+build linux -//+build systemd +//go:build linux && systemd +// +build linux,systemd package libpod @@ -235,6 +235,9 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption logrus.Errorf("Failed parse log line: %v", err) return } + if options.UseName { + logLine.CName = c.Name() + } if doTail { tailQueue = append(tailQueue, logLine) continue diff --git a/test/e2e/logs_test.go b/test/e2e/logs_test.go index 7c0fcc8ee293..cb795438d7d8 100644 --- a/test/e2e/logs_test.go +++ b/test/e2e/logs_test.go @@ -37,7 +37,9 @@ var _ = Describe("Podman logs", func() { } podmanTest = PodmanTestCreate(tempdir) podmanTest.Setup() - podmanTest.SeedImages() + if err := podmanTest.SeedImages(); err != nil { + os.Exit(1) + } }) AfterEach(func() { @@ -412,4 +414,33 @@ var _ = Describe("Podman logs", func() { logs.WaitWithDefaultTimeout() Expect(logs).To(Not(Exit(0))) }) + + It("podman pod logs with container names", func() { + SkipIfRemote("Remote can only process one container at a time") + SkipIfInContainer("journalctl inside a container doesn't work correctly") + podName := "testPod" + containerName1 := "container1" + containerName2 := "container2" + + testPod := podmanTest.Podman([]string{"pod", "create", fmt.Sprintf("--name=%s", podName)}) + testPod.WaitWithDefaultTimeout() + Expect(testPod).To(Exit(0)) + + log1 := podmanTest.Podman([]string{"run", "--name", containerName1, "-d", "--pod", podName, BB, "/bin/sh", "-c", "echo log1"}) + log1.WaitWithDefaultTimeout() + Expect(log1).To(Exit(0)) + + log2 := podmanTest.Podman([]string{"run", "--name", containerName2, "-d", "--pod", podName, BB, "/bin/sh", "-c", "echo log2"}) + log2.WaitWithDefaultTimeout() + Expect(log2).To(Exit(0)) + + results := podmanTest.Podman([]string{"pod", "logs", "--names", podName}) + results.WaitWithDefaultTimeout() + Expect(results).To(Exit(0)) + + output := results.OutputToStringArray() + Expect(output).To(HaveLen(2)) + Expect(output).To(ContainElement(ContainSubstring(containerName1))) + Expect(output).To(ContainElement(ContainSubstring(containerName2))) + }) })