Skip to content

Commit 94321ff

Browse files
committed
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.
1 parent 331e79b commit 94321ff

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

log/journal.go

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ func mapPriority(level Level) journal.Priority {
3131
if level <= InfoLevel {
3232
return journal.PriInfo
3333
}
34+
if level <= NoticeLevel {
35+
return journal.PriNotice
36+
}
3437
if level <= WarnLevel {
3538
return journal.PriWarning
3639
}

log/log.go

+24-6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ const (
3030
ErrorLevel = slog.LevelError
3131
// WarnLevel level. Non-critical entries that deserve eyes.
3232
WarnLevel = slog.LevelWarn
33+
// NoticeLevel level. Normal but significant conditions. Conditions that are not error conditions, but that may
34+
// require special handling. slog doesn't have a Notice level, so we use the average between Info and Warn.
35+
NoticeLevel = (slog.LevelInfo + slog.LevelWarn) / 2
3336
// InfoLevel level. General operational entries about what's going on inside the application.
3437
InfoLevel = slog.LevelInfo
3538
// 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
4346
}
4447

4548
var allLevels = []slog.Level{
46-
slog.LevelDebug,
47-
slog.LevelInfo,
48-
slog.LevelWarn,
49-
slog.LevelError,
49+
DebugLevel,
50+
InfoLevel,
51+
NoticeLevel,
52+
WarnLevel,
53+
ErrorLevel,
5054
}
5155

5256
var defaultHandlers = map[Level]Handler{
5357
DebugLevel: logFuncAdapter(slog.DebugContext),
5458
InfoLevel: logFuncAdapter(slog.InfoContext),
55-
WarnLevel: logFuncAdapter(slog.WarnContext),
56-
ErrorLevel: logFuncAdapter(slog.ErrorContext),
59+
// slog doesn't have a Notice level, so in the default handler, we use Warn instead.
60+
NoticeLevel: logFuncAdapter(slog.WarnContext),
61+
WarnLevel: logFuncAdapter(slog.WarnContext),
62+
ErrorLevel: logFuncAdapter(slog.ErrorContext),
5763
}
5864
var handlers = maps.Clone(defaultHandlers)
5965
var handlersMu = sync.RWMutex{}
@@ -166,6 +172,18 @@ func Infof(context context.Context, format string, args ...interface{}) {
166172
logf(context, InfoLevel, format, args...)
167173
}
168174

175+
// Notice outputs messages with the level [NoticeLevel] (when that is enabled) using the
176+
// configured logging handler.
177+
func Notice(context context.Context, args ...interface{}) {
178+
log(context, NoticeLevel, args...)
179+
}
180+
181+
// Noticef outputs messages with the level [NoticeLevel] (when that is enabled) using the
182+
// configured logging handler.
183+
func Noticef(context context.Context, format string, args ...interface{}) {
184+
logf(context, NoticeLevel, format, args...)
185+
}
186+
169187
// Warning outputs messages with the level [WarningLevel] (when that is enabled) using the
170188
// configured logging handler.
171189
func Warning(context context.Context, args ...interface{}) {

log/log_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
var supportedLevels = []log.Level{
1313
log.DebugLevel,
1414
log.InfoLevel,
15+
log.NoticeLevel,
1516
log.WarnLevel,
1617
log.ErrorLevel,
1718
}
@@ -38,6 +39,8 @@ func callLogHandler(ctx context.Context, level log.Level, args ...any) {
3839
log.Error(ctx, args...)
3940
case log.WarnLevel:
4041
log.Warning(ctx, args...)
42+
case log.NoticeLevel:
43+
log.Notice(ctx, args...)
4144
case log.InfoLevel:
4245
log.Info(ctx, args...)
4346
case log.DebugLevel:
@@ -51,6 +54,8 @@ func callLogHandlerf(ctx context.Context, level log.Level, format string, args .
5154
log.Errorf(ctx, format, args...)
5255
case log.WarnLevel:
5356
log.Warningf(ctx, format, args...)
57+
case log.NoticeLevel:
58+
log.Noticef(ctx, format, args...)
5459
case log.InfoLevel:
5560
log.Infof(ctx, format, args...)
5661
case log.DebugLevel:

0 commit comments

Comments
 (0)