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}