mirror of
https://github.com/containers/podman.git
synced 2025-06-02 10:46:09 +08:00
Add --follow to journald ctr logging
Signed-off-by: Peter Hunt <pehunt@redhat.com>
This commit is contained in:
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
Binary file not shown.
Reference in New Issue
Block a user