From 8d6866e1cb53433c9f933855b8d0664e5680f319 Mon Sep 17 00:00:00 2001 From: Itxaka Date: Thu, 5 Jun 2025 15:02:31 +0200 Subject: [PATCH] Track logger fds and provide a close method (#602) --- kcrypt/bus/bus.go | 1 + types/logger.go | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/kcrypt/bus/bus.go b/kcrypt/bus/bus.go index 9a20e8d..12f651c 100644 --- a/kcrypt/bus/bus.go +++ b/kcrypt/bus/bus.go @@ -55,6 +55,7 @@ func (b *Bus) Initialize() { } log := types.NewKairosLogger("kcrypt", level, false) + defer log.Close() b.LoadProviders() for i := range b.Events { diff --git a/types/logger.go b/types/logger.go index 125ed97..ed555bf 100644 --- a/types/logger.go +++ b/types/logger.go @@ -35,6 +35,7 @@ func newKairosLogger(name, level string, quiet bool, dirs ...string) KairosLogge var loggers []io.Writer var l zerolog.Level var err error + var fds []int // Add journald logger if available if writer := getJournaldWriter(); writer != nil { @@ -46,6 +47,7 @@ func newKairosLogger(name, level string, quiet bool, dirs ...string) KairosLogge logFileName := filepath.Join("/var/log/kairos/", logName) logfile, err := os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err == nil { + fds = append(fds, int(logfile.Fd())) loggers = append(loggers, zerolog.ConsoleWriter{Out: logfile, TimeFormat: time.RFC3339, NoColor: true, FieldsExclude: []string{"SYSLOG_IDENTIFIER"}}) } } @@ -57,6 +59,7 @@ func newKairosLogger(name, level string, quiet bool, dirs ...string) KairosLogge logFileName := filepath.Join(dir, logName) logfile, err := os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err == nil { + fds = append(fds, int(logfile.Fd())) loggers = append(loggers, zerolog.ConsoleWriter{Out: logfile, TimeFormat: time.RFC3339, NoColor: true, FieldsExclude: []string{"SYSLOG_IDENTIFIER"}}) } } @@ -89,6 +92,7 @@ func newKairosLogger(name, level string, quiet bool, dirs ...string) KairosLogge k := KairosLogger{ zerolog.New(multi).With().Str("SYSLOG_IDENTIFIER", fmt.Sprintf("kairos-%s", name)).Timestamp().Logger().Level(l), isJournaldAvailable(), + fds, } return k } @@ -97,6 +101,7 @@ func NewBufferLogger(b *bytes.Buffer) KairosLogger { return KairosLogger{ zerolog.New(b).With().Timestamp().Logger(), true, + []int{}, } } @@ -104,13 +109,22 @@ func NewNullLogger() KairosLogger { return KairosLogger{ zerolog.New(io.Discard).With().Timestamp().Logger(), true, + []int{}, } } // KairosLogger implements the bridge between zerolog and the logger.Interface that yip needs. type KairosLogger struct { zerolog.Logger - journald bool // Whether we are logging to journald, to avoid the file lock + journald bool // Whether we are logging to journald, to avoid the file lock + openFds []int // Keep track of open file descriptors to close them later +} + +func (m *KairosLogger) Close() { + // Close all open file descriptors + for _, fd := range m.openFds { + _ = os.NewFile(uintptr(fd), "").Close() + } } func (m *KairosLogger) SetLevel(level string) {