log.go

 1package log
 2
 3import (
 4	"os"
 5	"strings"
 6	"time"
 7
 8	log "github.com/charmbracelet/log/v2"
 9	"github.com/charmbracelet/soft-serve/pkg/config"
10)
11
12// NewLogger returns a new logger with default settings.
13func NewLogger(cfg *config.Config) (*log.Logger, *os.File, error) {
14	if cfg == nil {
15		return nil, nil, config.ErrNilConfig
16	}
17	logger := log.NewWithOptions(os.Stderr, log.Options{
18		ReportTimestamp: true,
19		TimeFormat:      time.DateOnly,
20	})
21
22	switch {
23	case config.IsVerbose():
24		logger.SetReportCaller(true)
25		fallthrough
26	case config.IsDebug():
27		logger.SetLevel(log.DebugLevel)
28	}
29
30	logger.SetTimeFormat(cfg.Log.TimeFormat)
31
32	switch strings.ToLower(cfg.Log.Format) {
33	case "json":
34		logger.SetFormatter(log.JSONFormatter)
35	case "logfmt":
36		logger.SetFormatter(log.LogfmtFormatter)
37	case "text":
38		logger.SetFormatter(log.TextFormatter)
39	}
40
41	var f *os.File
42	if cfg.Log.Path != "" {
43		var err error
44		f, err = os.OpenFile(cfg.Log.Path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
45		if err != nil {
46			return nil, nil, err
47		}
48		logger.SetOutput(f)
49	}
50
51	return logger, f, nil
52}