logx.go raw

   1  // Package logx is a small leveled logger. torly avoids the standard log
   2  // package so that the output format is identical on every target TinyGo
   3  // supports and nothing depends on log flags or output redirection.
   4  package logx
   5  
   6  import (
   7  	"fmt"
   8  	"os"
   9  	"sync"
  10  	"time"
  11  )
  12  
  13  // Level is a logging threshold.
  14  type Level int
  15  
  16  const (
  17  	LevelError Level = iota
  18  	LevelWarn
  19  	LevelInfo
  20  	LevelDebug
  21  )
  22  
  23  var (
  24  	mu    sync.Mutex
  25  	level = LevelInfo
  26  )
  27  
  28  // SetLevel sets the threshold from a name.
  29  func SetLevel(s string) {
  30  	switch s {
  31  	case "error":
  32  		level = LevelError
  33  	case "warn", "warning":
  34  		level = LevelWarn
  35  	case "debug":
  36  		level = LevelDebug
  37  	default:
  38  		level = LevelInfo
  39  	}
  40  }
  41  
  42  func logf(l Level, tag, format string, args ...any) {
  43  	if l > level {
  44  		return
  45  	}
  46  	mu.Lock()
  47  	defer mu.Unlock()
  48  	ts := time.Now().Format("2006-01-02T15:04:05Z07:00")
  49  	fmt.Fprintf(os.Stderr, "%s %s %s\n", ts, tag, fmt.Sprintf(format, args...))
  50  }
  51  
  52  // Errorf logs at error level.
  53  func Errorf(format string, args ...any) { logf(LevelError, "ERROR", format, args...) }
  54  
  55  // Warnf logs at warn level.
  56  func Warnf(format string, args ...any) { logf(LevelWarn, "WARN", format, args...) }
  57  
  58  // Infof logs at info level.
  59  func Infof(format string, args ...any) { logf(LevelInfo, "INFO", format, args...) }
  60  
  61  // Debugf logs at debug level.
  62  func Debugf(format string, args ...any) { logf(LevelDebug, "DEBUG", format, args...) }
  63