logger.go raw

   1  /* SPDX-License-Identifier: MIT
   2   *
   3   * Copyright (C) 2017-2025 WireGuard LLC. All Rights Reserved.
   4   */
   5  
   6  package device
   7  
   8  import (
   9  	"log"
  10  	"os"
  11  )
  12  
  13  // A Logger provides logging for a Device.
  14  // The functions are Printf-style functions.
  15  // They must be safe for concurrent use.
  16  // They do not require a trailing newline in the format.
  17  // If nil, that level of logging will be silent.
  18  type Logger struct {
  19  	Verbosef func(format string, args ...any)
  20  	Errorf   func(format string, args ...any)
  21  }
  22  
  23  // Log levels for use with NewLogger.
  24  const (
  25  	LogLevelSilent = iota
  26  	LogLevelError
  27  	LogLevelVerbose
  28  )
  29  
  30  // Function for use in Logger for discarding logged lines.
  31  func DiscardLogf(format string, args ...any) {}
  32  
  33  // NewLogger constructs a Logger that writes to stdout.
  34  // It logs at the specified log level and above.
  35  // It decorates log lines with the log level, date, time, and prepend.
  36  func NewLogger(level int, prepend string) *Logger {
  37  	logger := &Logger{DiscardLogf, DiscardLogf}
  38  	logf := func(prefix string) func(string, ...any) {
  39  		return log.New(os.Stdout, prefix+": "+prepend, log.Ldate|log.Ltime).Printf
  40  	}
  41  	if level >= LogLevelVerbose {
  42  		logger.Verbosef = logf("DEBUG")
  43  	}
  44  	if level >= LogLevelError {
  45  		logger.Errorf = logf("ERROR")
  46  	}
  47  	return logger
  48  }
  49