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