log.go

 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}