github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/log/testing.go (about) 1 package log 2 3 import ( 4 "fmt" 5 "log/slog" 6 "os" 7 "path/filepath" 8 "strings" 9 "testing" 10 "time" 11 12 "github.com/stretchr/testify/require" 13 ) 14 15 // NewTestingLogger returns a new testing logger 16 func NewTestingLogger(t *testing.T) *slog.Logger { 17 t.Helper() 18 19 // Parse the environment vars 20 envLevel := os.Getenv("LOG_LEVEL") 21 envPath := os.Getenv("LOG_PATH_DIR") 22 23 if !testing.Verbose() && envLevel == "" && envPath == "" { 24 return NewNoopLogger() 25 } 26 27 // Default logger config 28 logLevel := slog.LevelError 29 logOutput := os.Stdout 30 31 // Set the logger level, if any 32 switch strings.ToLower(envLevel) { 33 case "info": 34 logLevel = slog.LevelInfo 35 case "debug": 36 logLevel = slog.LevelDebug 37 case "warn": 38 logLevel = slog.LevelWarn 39 } 40 41 // Check if the log output needs to be a file 42 if envPath != "" { 43 // Create the top-level log directory 44 if err := os.Mkdir(envPath, 0o755); err != nil && !os.IsExist(err) { 45 t.Fatalf("Failed to create log directory: %v", err) 46 } 47 48 logName := fmt.Sprintf( 49 "%s-%d.log", 50 strings.ReplaceAll(t.Name(), "/", "_"), // unique test name 51 time.Now().Unix(), // unique test timestamp 52 ) 53 logPath := filepath.Join(envPath, logName) 54 55 logFile, err := os.Create(logPath) 56 require.NoError(t, err) 57 58 t.Cleanup(func() { 59 _ = logFile.Close() 60 }) 61 62 logOutput = logFile 63 } 64 65 // Create the log handler 66 logHandler := slog.NewTextHandler( 67 logOutput, 68 &slog.HandlerOptions{ 69 AddSource: true, 70 Level: logLevel, 71 }, 72 ) 73 74 return slog.New(logHandler) 75 }