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