var logVerbosity int = 0
var logLevel string = "notice"
- type Logger struct {
+ // interface coreLogger contains only the core functionality needed for logging, without
+ // level or verbosity methods.
+ //
+ // This interface can be implemented by mocks for testing.
+ type coreLogger interface {
+ WithLevel(Level) coreLogger
+
+ Print(...any)
+ Printf(string, ...any)
+ Println(...any)
+ Fatal(...any)
+ Fatalf(string, ...any)
+ Panic(...any)
+ Panicf(string, ...any)
+ Panicln(...any)
+ }
+
+ // interface Logger describes a logger with verbosity and level filtering, and prefix
+ // management.
+ type Logger interface {
+ coreLogger
+
+ AppendPrefix(string) Logger
+ WithPrefix(string) Logger
+ V(int) Logger
++ NewWriter(Level) io.Writer
+
+ Debug(...any)
+ Debugf(string, ...any)
+ Info(...any)
+ Infof(string, ...any)
+ Notice(...any)
+ Noticef(string, ...any)
+ Warning(...any)
+ Warningf(string, ...any)
+ Warn(...any)
+ Warnf(string, ...any)
+ Error(...any)
+ Errorf(string, ...any)
+ Critical(...any)
+ Criticalf(string, ...any)
+ Alert(...any)
+ Alertf(string, ...any)
+ }
+
+ type internalLogger struct {
*log.Logger
level Level
return args
}
- func (l *Logger) Print(v ...any) {
- args := l.prependPrefixes(v)
- l.Logger.Print(args...)
+ func (l *internalLogger) Fatal(v ...any) {
+ if len(v) > 0 {
+ if arg1, ok := v[0].(string); ok {
+ if l.prefix != "" {
+ v[0] = FATAL.prefix(l.Writer()) + "[" + l.prefix + "] " + arg1
+ }
+ }
+ }
+
+ l.Logger.Fatal(v...)
}
- func (l *Logger) Printf(fmtstr string, v ...any) {
+ func (l *internalLogger) Fatalf(fmtstr string, v ...any) {
if l.prefix != "" {
- fmtstr = "[" + l.prefix + "] " + fmtstr
+ fmtstr = FATAL.prefix(l.Writer()) + "[" + l.prefix + "] " + fmtstr
}
- l.Logger.Printf(l.level.prefix(l.Writer())+fmtstr, v...)
+ l.Logger.Fatalf(fmtstr, v...)
}
- func (l *Logger) Println(v ...any) {
- l.Print(v...)
++func (l *internalLogger) NewWriter(lv Level) io.Writer {
++ return &writer{
++ logger: l,
++ level: lv,
++ }
++}
++
+ func (l *logger) V(level int) Logger {
+ if logVerbosity >= level {
+ return l
+ }
+ return NullLogger()
}
- func (l *Logger) Debug(v ...any) {
+ func (l *logger) WithPrefix(prefix string) Logger {
+ return &logger{
+ internalLogger: &internalLogger{
+ Logger: l.Logger,
+ prefix: l.internalLogger.prefix,
+ level: l.level,
+ },
+ }
+ }
+
+ func (l *logger) AppendPrefix(prefix string) Logger {
+ return &logger{
+ internalLogger: &internalLogger{
+ Logger: l.Logger,
+ prefix: l.internalLogger.prefix + prefix,
+ level: l.level,
+ },
+ }
+ }
+
+ func (l *logger) Debug(v ...any) {
l.WithLevel(DEBUG).Print(v...)
}