log.go

 1package log
 2
 3import (
 4	"os"
 5	"strconv"
 6	"strings"
 7	"time"
 8
 9	"github.com/charmbracelet/log"
10	"github.com/charmbracelet/soft-serve/server/config"
11)
12
13var contextKey = &struct{ string }{"logger"}
14
15// NewDefaultLogger returns a new logger with default settings.
16func NewDefaultLogger() *log.Logger {
17	cfg := config.DefaultConfig()
18	if cfg.Exist() {
19		if err := config.ParseConfig(cfg, cfg.FilePath()); err != nil {
20			log.Errorf("failed to parse config: %v", err)
21		}
22	}
23
24	logger := log.NewWithOptions(os.Stderr, log.Options{
25		ReportTimestamp: true,
26		TimeFormat:      time.DateOnly,
27	})
28
29	if debug, _ := strconv.ParseBool(os.Getenv("SOFT_SERVE_DEBUG")); debug {
30		logger.SetLevel(log.DebugLevel)
31
32		if verbose, _ := strconv.ParseBool(os.Getenv("SOFT_SERVE_VERBOSE")); verbose {
33			logger.SetReportCaller(true)
34		}
35	}
36
37	logger.SetTimeFormat(cfg.Log.TimeFormat)
38
39	switch strings.ToLower(cfg.Log.Format) {
40	case "json":
41		logger.SetFormatter(log.JSONFormatter)
42	case "logfmt":
43		logger.SetFormatter(log.LogfmtFormatter)
44	case "text":
45		logger.SetFormatter(log.TextFormatter)
46	}
47
48	return logger
49}