mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
Fix journald logs with more than 1 container
A podman logs on multiple containers will correctly display the container ID next to the log line Signed-off-by: Ashley Cui <acui@redhat.com>
This commit is contained in:
@ -8,7 +8,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/containers/podman/v2/libpod/define"
|
"github.com/containers/podman/v2/libpod/define"
|
||||||
@ -41,7 +40,11 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption
|
|||||||
} else {
|
} else {
|
||||||
config.NumFromTail = uint64(options.Tail)
|
config.NumFromTail = uint64(options.Tail)
|
||||||
}
|
}
|
||||||
config.Formatter = journalFormatter
|
if options.Multi {
|
||||||
|
config.Formatter = journalFormatterWithID
|
||||||
|
} else {
|
||||||
|
config.Formatter = journalFormatter
|
||||||
|
}
|
||||||
defaultTime := time.Time{}
|
defaultTime := time.Time{}
|
||||||
if options.Since != defaultTime {
|
if options.Since != defaultTime {
|
||||||
// coreos/go-systemd/sdjournal doesn't correctly handle requests for data in the future
|
// coreos/go-systemd/sdjournal doesn't correctly handle requests for data in the future
|
||||||
@ -137,7 +140,45 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func journalFormatterWithID(entry *journal.JournalEntry) (string, error) {
|
||||||
|
// get
|
||||||
|
output, err := formatterPrefix(entry)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
id, ok := entry.Fields["CONTAINER_ID_FULL"]
|
||||||
|
if !ok {
|
||||||
|
return "", fmt.Errorf("no CONTAINER_ID_FULL field present in journal entry")
|
||||||
|
}
|
||||||
|
if len(id) > 12 {
|
||||||
|
id = id[:12]
|
||||||
|
}
|
||||||
|
output += fmt.Sprintf("%s ", id)
|
||||||
|
// Append message
|
||||||
|
msg, err := formatterMessage(entry)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
output += msg
|
||||||
|
return output, nil
|
||||||
|
}
|
||||||
|
|
||||||
func journalFormatter(entry *journal.JournalEntry) (string, error) {
|
func journalFormatter(entry *journal.JournalEntry) (string, error) {
|
||||||
|
output, err := formatterPrefix(entry)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// Append message
|
||||||
|
msg, err := formatterMessage(entry)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
output += msg
|
||||||
|
return output, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatterPrefix(entry *journal.JournalEntry) (string, error) {
|
||||||
usec := entry.RealtimeTimestamp
|
usec := entry.RealtimeTimestamp
|
||||||
tsString := time.Unix(0, int64(usec)*int64(time.Microsecond)).Format(logs.LogTimeFormat)
|
tsString := time.Unix(0, int64(usec)*int64(time.Microsecond)).Format(logs.LogTimeFormat)
|
||||||
output := fmt.Sprintf("%s ", tsString)
|
output := fmt.Sprintf("%s ", tsString)
|
||||||
@ -160,13 +201,16 @@ func journalFormatter(entry *journal.JournalEntry) (string, error) {
|
|||||||
output += fmt.Sprintf("%s ", logs.FullLogType)
|
output += fmt.Sprintf("%s ", logs.FullLogType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return output, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatterMessage(entry *journal.JournalEntry) (string, error) {
|
||||||
// Finally, append the message
|
// Finally, append the message
|
||||||
msg, ok := entry.Fields["MESSAGE"]
|
msg, ok := entry.Fields["MESSAGE"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", fmt.Errorf("no MESSAGE field present in journal entry")
|
return "", fmt.Errorf("no MESSAGE field present in journal entry")
|
||||||
}
|
}
|
||||||
output += strings.TrimSpace(msg)
|
return msg, nil
|
||||||
return output, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type FollowBuffer struct {
|
type FollowBuffer struct {
|
||||||
|
Reference in New Issue
Block a user