executors/internal/autoscaler/logger/logger.go (146 lines of code) (raw):

package logger import ( "fmt" "io" "log" "github.com/hashicorp/go-hclog" "github.com/sirupsen/logrus" ) type Logger struct { entry *logrus.Entry name string } var ( logrusToHclog = []hclog.Level{ logrus.PanicLevel: hclog.Error, logrus.FatalLevel: hclog.Error, logrus.ErrorLevel: hclog.Error, logrus.WarnLevel: hclog.Warn, logrus.InfoLevel: hclog.Info, logrus.DebugLevel: hclog.Debug, logrus.TraceLevel: hclog.Trace, } hclogToLogrus = []logrus.Level{ hclog.NoLevel: logrus.InfoLevel, hclog.Trace: logrus.TraceLevel, hclog.Debug: logrus.DebugLevel, hclog.Info: logrus.InfoLevel, hclog.Warn: logrus.WarnLevel, hclog.Error: logrus.ErrorLevel, hclog.Off: logrus.InfoLevel, } ) func New(entry *logrus.Entry) *Logger { entry = entry.Dup() if entry.Logger == nil { entry.Logger = logrus.StandardLogger() } return &Logger{entry: entry} } func (l *Logger) level(lvl hclog.Level) logrus.Level { return hclogToLogrus[lvl] } func (l *Logger) fields(args []any) logrus.Fields { if len(args) == 0 { return nil } if len(args)%2 != 0 { args = append(args, "<unknown>") } fields := make(logrus.Fields, len(args)/2) for i := 0; i < len(args); i += 2 { key, ok := args[i].(string) if !ok { key = fmt.Sprintf("%v", args[i]) } fields[key] = args[i+1] } return fields } func (l *Logger) Log(level hclog.Level, msg string, args ...interface{}) { entry := l.entry if len(args) > 0 { entry = entry.WithFields(l.fields(args)) } entry.Log(l.level(level), msg) } func (l *Logger) Trace(msg string, args ...interface{}) { l.Log(hclog.Trace, msg, args...) } func (l *Logger) Debug(msg string, args ...interface{}) { l.Log(hclog.Debug, msg, args...) } func (l *Logger) Info(msg string, args ...interface{}) { l.Log(hclog.Info, msg, args...) } func (l *Logger) Warn(msg string, args ...interface{}) { l.Log(hclog.Warn, msg, args...) } func (l *Logger) Error(msg string, args ...interface{}) { l.Log(hclog.Error, msg, args...) } func (l *Logger) IsTrace() bool { return l.entry.Logger.IsLevelEnabled(logrus.TraceLevel) } func (l *Logger) IsDebug() bool { return l.entry.Logger.IsLevelEnabled(logrus.DebugLevel) } func (l *Logger) IsInfo() bool { return l.entry.Logger.IsLevelEnabled(logrus.InfoLevel) } func (l *Logger) IsWarn() bool { return l.entry.Logger.IsLevelEnabled(logrus.WarnLevel) } func (l *Logger) IsError() bool { return l.entry.Logger.IsLevelEnabled(logrus.ErrorLevel) } func (l *Logger) ImpliedArgs() []any { if len(l.entry.Data) == 0 { return nil } fields := make([]any, len(l.entry.Data)*2) for key, val := range l.entry.Data { fields = append(fields, key, val) } return fields } func (l *Logger) With(args ...interface{}) hclog.Logger { if len(args) == 0 { return l } return New(l.entry.WithFields(l.fields(args))) } func (l *Logger) Name() string { return l.name } func (l *Logger) Named(name string) hclog.Logger { if l.name != "" { name = l.name + "." + name } return l.ResetNamed(name) } func (l *Logger) ResetNamed(name string) hclog.Logger { logger := New(l.entry.WithFields(logrus.Fields{"subsystem": name})) logger.name = name return logger } func (l *Logger) SetLevel(level hclog.Level) { l.entry.Logger.SetLevel(l.level(level)) } func (l *Logger) GetLevel() hclog.Level { return logrusToHclog[l.entry.Logger.GetLevel()] } func (l *Logger) StandardLogger(opts *hclog.StandardLoggerOptions) *log.Logger { logger := hclog.Default() logger.SetLevel(l.GetLevel()) logger.Named(l.name) logger.With(l.ImpliedArgs()...) return logger.StandardLogger(opts) } func (l *Logger) StandardWriter(opts *hclog.StandardLoggerOptions) io.Writer { logger := hclog.Default() logger.SetLevel(l.GetLevel()) logger.Named(l.name) logger.With(l.ImpliedArgs()...) return logger.StandardWriter(opts) }