1package log
2
3import (
4 "os"
5 "strings"
6 "time"
7
8 "github.com/charmbracelet/log"
9 "github.com/charmbracelet/soft-serve/server/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}