repo-sync/config/log.go
James Coleman 5af1dd8928
Some checks failed
Go package / build (push) Has been cancelled
first commit
2026-07-28 19:22:20 -05:00

56 lines
1.5 KiB
Go

package config
import (
"io"
"os"
log "github.com/sirupsen/logrus"
)
// logFiles holds the files opened by the previous SetupLogging call so a
// reload can close them once the new outputs are installed.
var logFiles []*os.File
// SetupLogging applies the configured log level, formatter, and outputs to
// the global logger. Unknown output paths are treated as files opened for
// appending; failures fall back to stderr so the server always logs.
func SetupLogging(lc LogConfig) {
level, err := log.ParseLevel(lc.Level)
if err != nil {
level = log.InfoLevel
}
log.SetLevel(level)
if lc.Type == "json" {
log.SetFormatter(&log.JSONFormatter{})
} else {
log.SetFormatter(&log.TextFormatter{FullTimestamp: true})
}
var writers []io.Writer
var files []*os.File
for _, output := range lc.Outputs {
if output == "console" {
writers = append(writers, os.Stderr)
continue
}
f, err := os.OpenFile(expandHome(output), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.WithError(err).WithField("output", output).Warn("Unable to open log output; skipping.")
continue
}
writers = append(writers, f)
files = append(files, f)
}
if len(writers) == 0 {
writers = append(writers, os.Stderr)
}
log.SetOutput(io.MultiWriter(writers...))
// Close the previous reload's files only after the new writer is
// installed; the logger serializes writes, so none remain in flight.
for _, f := range logFiles {
f.Close()
}
logFiles = files
}