1package log
 2
 3import (
 4	"os"
 5	"strings"
 6	"time"
 7
 8	"github.com/charmbracelet/log"
 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	logger := log.NewWithOptions(os.Stderr, log.Options{
15		ReportTimestamp: true,
16		TimeFormat:      time.DateOnly,
17	})
18
19	switch {
20	case config.IsVerbose():
21		logger.SetReportCaller(true)
22		fallthrough
23	case config.IsDebug():
24		logger.SetLevel(log.DebugLevel)
25	}
26
27	logger.SetTimeFormat(cfg.Log.TimeFormat)
28
29	switch strings.ToLower(cfg.Log.Format) {
30	case "json":
31		logger.SetFormatter(log.JSONFormatter)
32	case "logfmt":
33		logger.SetFormatter(log.LogfmtFormatter)
34	case "text":
35		logger.SetFormatter(log.TextFormatter)
36	}
37
38	var f *os.File
39	if cfg.Log.Path != "" {
40		f, err := os.OpenFile(cfg.Log.Path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
41		if err != nil {
42			return nil, nil, err
43		}
44		logger.SetOutput(f)
45	}
46
47	return logger, f, nil
48}