on main help sign in
fix(server): log to stderr if it's a terminal
bc383d9Ayman Bagabas
internal/cmd/server.go+7−1
@@ -13,6 +13,7 @@ import (
13 "github.com/charmbracelet/crush/internal/config"
13 "github.com/charmbracelet/crush/internal/config"
14 crushlog "github.com/charmbracelet/crush/internal/log"
14 crushlog "github.com/charmbracelet/crush/internal/log"
15 "github.com/charmbracelet/crush/internal/server"
15 "github.com/charmbracelet/crush/internal/server"
16+ "github.com/charmbracelet/x/term"
16 "github.com/spf13/cobra"
17 "github.com/spf13/cobra"
17)
18)
18
19
@@ -42,7 +43,12 @@ var serverCmd = &cobra.Command{
42 }
43 }
43
44
44 logFile := filepath.Join(config.GlobalCacheDir(), "server-"+safeNameRegexp.ReplaceAllString(serverHost, "_"), "crush.log")
45 logFile := filepath.Join(config.GlobalCacheDir(), "server-"+safeNameRegexp.ReplaceAllString(serverHost, "_"), "crush.log")
46+
47+ if term.IsTerminal(os.Stderr.Fd()) {
45− crushlog.Setup(logFile, debug)
48+ crushlog.Setup(logFile, debug, os.Stderr)
49+ } else {
50+ crushlog.Setup(logFile, debug)
51+ }
46
52
47 hostURL, err := server.ParseHostURL(serverHost)
53 hostURL, err := server.ParseHostURL(serverHost)
48 if err != nil {
54 if err != nil {
internal/log/log.go+20−4
@@ -2,6 +2,7 @@ package log
2
2
3import (
3import (
4 "fmt"
4 "fmt"
5+ "io"
5 "log/slog"
6 "log/slog"
6 "os"
7 "os"
7 "runtime/debug"
8 "runtime/debug"
@@ -10,6 +11,7 @@ import (
10 "time"
11 "time"
11
12
12 "github.com/charmbracelet/crush/internal/event"
13 "github.com/charmbracelet/crush/internal/event"
14+ "github.com/charmbracelet/x/term"
13 "gopkg.in/natefinch/lumberjack.v2"
15 "gopkg.in/natefinch/lumberjack.v2"
14)
16)
15
17
@@ -18,7 +20,7 @@ var (
18 initialized atomic.Bool
20 initialized atomic.Bool
19)
21)
20
22
21−func Setup(logFile string, debug bool) {
23+func Setup(logFile string, debug bool, ws ...io.Writer) {
22 initOnce.Do(func() {
24 initOnce.Do(func() {
23 logRotator := &lumberjack.Logger{
25 logRotator := &lumberjack.Logger{
24 Filename: logFile,
26 Filename: logFile,
@@ -33,12 +35,26 @@ func Setup(logFile string, debug bool) {
33 level = slog.LevelDebug
35 level = slog.LevelDebug
34 }
36 }
35
37
36− logger := slog.NewJSONHandler(logRotator, &slog.HandlerOptions{
38+ opts := &slog.HandlerOptions{
37 Level: level,
39 Level: level,
38 AddSource: true,
40 AddSource: true,
39− })
41+ }
42+
43+ var handlers []slog.Handler
44+ handlers = append(handlers, slog.NewJSONHandler(logRotator, opts))
45+
46+ for _, w := range ws {
47+ if w == nil {
48+ continue
49+ }
50+ if f, ok := w.(term.File); ok && term.IsTerminal(f.Fd()) {
51+ handlers = append(handlers, slog.NewTextHandler(w, opts))
52+ } else {
53+ handlers = append(handlers, slog.NewJSONHandler(w, opts))
54+ }
55+ }
40
56
41− slog.SetDefault(slog.New(logger))
57+ slog.SetDefault(slog.New(slog.NewMultiHandler(handlers...)))
42 initialized.Store(true)
58 initialized.Store(true)
43 })
59 })
44}
60}