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  }