From 94321ff1a4ee083f8ba86cb1df1529fa3a09888e Mon Sep 17 00:00:00 2001 From: Adrian Dombeck Date: Tue, 28 Jan 2025 15:13:12 +0100 Subject: [PATCH 1/2] Support logging to the journal with priority "notice" The notice level is a syslog severity level between the info and warning levels. It's meant for important events which are not error conditions, but that may require special handling. --- log/journal.go | 3 +++ log/log.go | 30 ++++++++++++++++++++++++------ log/log_test.go | 5 +++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/log/journal.go b/log/journal.go index 730289cc8..2bf391320 100644 --- a/log/journal.go +++ b/log/journal.go @@ -31,6 +31,9 @@ func mapPriority(level Level) journal.Priority { if level <= InfoLevel { return journal.PriInfo } + if level <= NoticeLevel { + return journal.PriNotice + } if level <= WarnLevel { return journal.PriWarning } diff --git a/log/log.go b/log/log.go index 903fe4230..15f720a3c 100644 --- a/log/log.go +++ b/log/log.go @@ -30,6 +30,9 @@ const ( ErrorLevel = slog.LevelError // WarnLevel level. Non-critical entries that deserve eyes. WarnLevel = slog.LevelWarn + // NoticeLevel level. Normal but significant conditions. Conditions that are not error conditions, but that may + // require special handling. slog doesn't have a Notice level, so we use the average between Info and Warn. + NoticeLevel = (slog.LevelInfo + slog.LevelWarn) / 2 // InfoLevel level. General operational entries about what's going on inside the application. InfoLevel = slog.LevelInfo // DebugLevel level. Usually only enabled when debugging. Very verbose logging. @@ -43,17 +46,20 @@ func logFuncAdapter(slogFunc func(ctx context.Context, msg string, args ...inter } var allLevels = []slog.Level{ - slog.LevelDebug, - slog.LevelInfo, - slog.LevelWarn, - slog.LevelError, + DebugLevel, + InfoLevel, + NoticeLevel, + WarnLevel, + ErrorLevel, } var defaultHandlers = map[Level]Handler{ DebugLevel: logFuncAdapter(slog.DebugContext), InfoLevel: logFuncAdapter(slog.InfoContext), - WarnLevel: logFuncAdapter(slog.WarnContext), - ErrorLevel: logFuncAdapter(slog.ErrorContext), + // slog doesn't have a Notice level, so in the default handler, we use Warn instead. + NoticeLevel: logFuncAdapter(slog.WarnContext), + WarnLevel: logFuncAdapter(slog.WarnContext), + ErrorLevel: logFuncAdapter(slog.ErrorContext), } var handlers = maps.Clone(defaultHandlers) var handlersMu = sync.RWMutex{} @@ -166,6 +172,18 @@ func Infof(context context.Context, format string, args ...interface{}) { logf(context, InfoLevel, format, args...) } +// Notice outputs messages with the level [NoticeLevel] (when that is enabled) using the +// configured logging handler. +func Notice(context context.Context, args ...interface{}) { + log(context, NoticeLevel, args...) +} + +// Noticef outputs messages with the level [NoticeLevel] (when that is enabled) using the +// configured logging handler. +func Noticef(context context.Context, format string, args ...interface{}) { + logf(context, NoticeLevel, format, args...) +} + // Warning outputs messages with the level [WarningLevel] (when that is enabled) using the // configured logging handler. func Warning(context context.Context, args ...interface{}) { diff --git a/log/log_test.go b/log/log_test.go index 1a8d25838..5d1981310 100644 --- a/log/log_test.go +++ b/log/log_test.go @@ -12,6 +12,7 @@ import ( var supportedLevels = []log.Level{ log.DebugLevel, log.InfoLevel, + log.NoticeLevel, log.WarnLevel, log.ErrorLevel, } @@ -38,6 +39,8 @@ func callLogHandler(ctx context.Context, level log.Level, args ...any) { log.Error(ctx, args...) case log.WarnLevel: log.Warning(ctx, args...) + case log.NoticeLevel: + log.Notice(ctx, args...) case log.InfoLevel: log.Info(ctx, args...) case log.DebugLevel: @@ -51,6 +54,8 @@ func callLogHandlerf(ctx context.Context, level log.Level, format string, args . log.Errorf(ctx, format, args...) case log.WarnLevel: log.Warningf(ctx, format, args...) + case log.NoticeLevel: + log.Noticef(ctx, format, args...) case log.InfoLevel: log.Infof(ctx, format, args...) case log.DebugLevel: From bb2fe1e442db206f20faa39dc03ebf54e30840ec Mon Sep 17 00:00:00 2001 From: Adrian Dombeck Date: Tue, 28 Jan 2025 15:15:09 +0100 Subject: [PATCH 2/2] Log notice level messages by default We want users to see notice level messages, which are used for important events that may require special handling. --- internal/consts/consts.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/consts/consts.go b/internal/consts/consts.go index 49abdd204..f68c4d44c 100644 --- a/internal/consts/consts.go +++ b/internal/consts/consts.go @@ -13,7 +13,7 @@ const ( TEXTDOMAIN = "adsys" // DefaultLogLevel is the default logging level selected without any option. - DefaultLogLevel = log.WarnLevel + DefaultLogLevel = log.NoticeLevel // DefaultSocketPath is the default socket path. DefaultSocketPath = "/run/authd.sock"