chore: switch to charmbracelet/log

Ayman Bagabas created

Change summary

cmd/soft/root.go        |  4 ++--
cmd/soft/serve.go       |  8 +++++---
config/auth.go          | 11 ++++++-----
config/config.go        |  7 ++++---
config/git.go           |  7 ++++---
examples/setuid/main.go | 17 +++++++++--------
server/config/config.go | 11 ++++++-----
server/server.go        |  7 ++++---
8 files changed, 40 insertions(+), 32 deletions(-)

Detailed changes

cmd/soft/root.go 🔗

@@ -1,9 +1,9 @@
 package main
 
 import (
-	"log"
 	"runtime/debug"
 
+	"github.com/charmbracelet/log"
 	"github.com/spf13/cobra"
 )
 
@@ -49,6 +49,6 @@ func init() {
 
 func main() {
 	if err := rootCmd.Execute(); err != nil {
-		log.Fatalln(err)
+		log.Fatal(err)
 	}
 }

cmd/soft/serve.go 🔗

@@ -2,12 +2,14 @@ package main
 
 import (
 	"context"
-	"log"
+	"fmt"
 	"os"
 	"os/signal"
 	"syscall"
 	"time"
 
+	"github.com/charmbracelet/log"
+
 	"github.com/charmbracelet/soft-serve/server"
 	"github.com/charmbracelet/soft-serve/server/config"
 	"github.com/spf13/cobra"
@@ -23,7 +25,7 @@ var (
 			cfg := config.DefaultConfig()
 			s := server.NewServer(cfg)
 
-			log.Printf("Starting SSH server on %s:%d", cfg.BindAddr, cfg.Port)
+			log.Print("Starting SSH server", "addr", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.Port))
 
 			done := make(chan os.Signal, 1)
 			lch := make(chan error, 1)
@@ -36,7 +38,7 @@ var (
 			signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
 			<-done
 
-			log.Printf("Stopping SSH server on %s:%d", cfg.BindAddr, cfg.Port)
+			log.Print("Stopping SSH server", "addr", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.Port))
 			ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
 			defer cancel()
 			if err := s.Shutdown(ctx); err != nil {

config/auth.go 🔗

@@ -1,9 +1,10 @@
 package config
 
 import (
-	"log"
 	"strings"
 
+	"github.com/charmbracelet/log"
+
 	gm "github.com/charmbracelet/wish/git"
 	"github.com/gliderlabs/ssh"
 	gossh "golang.org/x/crypto/ssh"
@@ -14,19 +15,19 @@ func (cfg *Config) Push(repo string, pk ssh.PublicKey) {
 	go func() {
 		err := cfg.Reload()
 		if err != nil {
-			log.Printf("error reloading after push: %s", err)
+			log.Error("error reloading after push", "err", err)
 		}
 		if cfg.Cfg.Callbacks != nil {
 			cfg.Cfg.Callbacks.Push(repo)
 		}
 		r, err := cfg.Source.GetRepo(repo)
 		if err != nil {
-			log.Printf("error getting repo after push: %s", err)
+			log.Error("error getting repo after push", "err", err)
 			return
 		}
 		err = r.UpdateServerInfo()
 		if err != nil {
-			log.Printf("error updating server info after push: %s", err)
+			log.Error("error updating server info after push", "err", err)
 		}
 	}()
 }
@@ -88,7 +89,7 @@ func (cfg *Config) accessForKey(repo string, pk ssh.PublicKey) gm.AccessLevel {
 		for _, k := range user.PublicKeys {
 			apk, _, _, _, err := ssh.ParseAuthorizedKey([]byte(strings.TrimSpace(k)))
 			if err != nil {
-				log.Printf("error: malformed authorized key: '%s'", k)
+				log.Error("malformed authorized key", "key", k)
 				return gm.NoAccess
 			}
 			if ssh.KeysEqual(pk, apk) {

config/config.go 🔗

@@ -5,13 +5,14 @@ import (
 	"encoding/json"
 	"errors"
 	"io/fs"
-	"log"
 	"path/filepath"
 	"strings"
 	"sync"
 	"text/template"
 	"time"
 
+	"github.com/charmbracelet/log"
+
 	"golang.org/x/crypto/ssh"
 	"gopkg.in/yaml.v3"
 
@@ -192,7 +193,7 @@ func (cfg *Config) Reload() error {
 		}
 		if err := cfg.readConfig(repo, &rc); err != nil {
 			if !errors.Is(err, ErrNoConfig) {
-				log.Printf("error reading config: %v", err)
+				log.Error("error reading config", "err", err)
 			}
 			continue
 		}
@@ -208,7 +209,7 @@ func (cfg *Config) Reload() error {
 		repo := r.Repo()
 		err = r.UpdateServerInfo()
 		if err != nil {
-			log.Printf("error updating server info for %s: %s", repo, err)
+			log.Error("error updating server info", "repo", repo, "err", err)
 		}
 		pat := "README*"
 		rp := ""

config/git.go 🔗

@@ -2,11 +2,12 @@ package config
 
 import (
 	"errors"
-	"log"
 	"os"
 	"path/filepath"
 	"sync"
 
+	"github.com/charmbracelet/log"
+
 	"github.com/charmbracelet/soft-serve/git"
 	"github.com/gobwas/glob"
 	"github.com/golang/groupcache/lru"
@@ -239,7 +240,7 @@ func (rs *RepoSource) LoadRepo(name string) error {
 	rp := filepath.Join(rs.Path, name)
 	r, err := rs.open(rp)
 	if err != nil {
-		log.Printf("error opening repository %q: %s", rp, err)
+		log.Error("error opening repository", "path", rp, "err", err)
 		return err
 	}
 	rs.repos[name] = r
@@ -254,7 +255,7 @@ func (rs *RepoSource) LoadRepos() error {
 	}
 	for _, de := range rd {
 		if !de.IsDir() {
-			log.Printf("warning: %q is not a directory", filepath.Join(rs.Path, de.Name()))
+			log.Warn("not a directory", "path", filepath.Join(rs.Path, de.Name()))
 			continue
 		}
 		err = rs.LoadRepo(de.Name())

examples/setuid/main.go 🔗

@@ -11,13 +11,14 @@ import (
 	"context"
 	"flag"
 	"fmt"
-	"log"
 	"net"
 	"os"
 	"os/signal"
 	"syscall"
 	"time"
 
+	"github.com/charmbracelet/log"
+
 	"github.com/charmbracelet/soft-serve/server"
 	"github.com/charmbracelet/soft-serve/server/config"
 )
@@ -34,14 +35,14 @@ func main() {
 	// To listen on port 22 we need root privileges
 	ls, err := net.Listen("tcp", addr)
 	if err != nil {
-		log.Fatalf("Can't listen: %s", err)
+		log.Fatal("Can't listen", "err", err)
 	}
 	// We don't need root privileges any more
 	if err := syscall.Setgid(*gid); err != nil {
-		log.Fatalf("Setgid error: %s", err)
+		log.Fatal("Setgid error", "err", err)
 	}
 	if err := syscall.Setuid(*uid); err != nil {
-		log.Fatalf("Setuid error: %s", err)
+		log.Fatal("Setuid error", "err", err)
 	}
 	cfg := config.DefaultConfig()
 	cfg.Port = *port
@@ -50,19 +51,19 @@ func main() {
 	done := make(chan os.Signal, 1)
 	signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
 
-	log.Printf("Starting SSH server on %s:%d", cfg.BindAddr, cfg.Port)
+	log.Print("Starting SSH server", "addr", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.Port))
 	go func() {
 		if err := s.Serve(ls); err != nil {
-			log.Fatalln(err)
+			log.Fatal(err)
 		}
 	}()
 
 	<-done
 
-	log.Printf("Stopping SSH server on %s:%d", cfg.BindAddr, cfg.Port)
+	log.Print("Stopping SSH server", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.Port))
 	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
 	defer func() { cancel() }()
 	if err := s.Shutdown(ctx); err != nil {
-		log.Fatalln(err)
+		log.Fatal(err)
 	}
 }

server/config/config.go 🔗

@@ -1,10 +1,11 @@
 package config
 
 import (
-	"log"
+	glog "log"
 	"path/filepath"
 
 	"github.com/caarlos0/env/v6"
+	"github.com/charmbracelet/log"
 )
 
 // Callbacks provides an interface that can be used to run callbacks on different events.
@@ -23,15 +24,15 @@ type Config struct {
 	RepoPath         string   `env:"SOFT_SERVE_REPO_PATH" envDefault:".repos"`
 	InitialAdminKeys []string `env:"SOFT_SERVE_INITIAL_ADMIN_KEY" envSeparator:"\n"`
 	Callbacks        Callbacks
-	ErrorLog         *log.Logger
+	ErrorLog         *glog.Logger
 }
 
 // DefaultConfig returns a Config with the values populated with the defaults
 // or specified environment variables.
 func DefaultConfig() *Config {
-	cfg := &Config{ErrorLog: log.Default()}
+	cfg := &Config{ErrorLog: log.StandardLog(log.StandardLogOption{ForceLevel: log.ErrorLevel})}
 	if err := env.Parse(cfg); err != nil {
-		log.Fatalln(err)
+		log.Fatal(err)
 	}
 	if cfg.KeyPath == "" {
 		// NB: cross-platform-compatible path
@@ -47,7 +48,7 @@ func (c *Config) WithCallbacks(callbacks Callbacks) *Config {
 }
 
 // WithErrorLogger sets the error logger for the configuration.
-func (c *Config) WithErrorLogger(logger *log.Logger) *Config {
+func (c *Config) WithErrorLogger(logger *glog.Logger) *Config {
 	c.ErrorLog = logger
 	return c
 }

server/server.go 🔗

@@ -3,11 +3,12 @@ package server
 import (
 	"context"
 	"fmt"
-	"log"
 	"net"
 	"path/filepath"
 	"strings"
 
+	"github.com/charmbracelet/log"
+
 	appCfg "github.com/charmbracelet/soft-serve/config"
 	"github.com/charmbracelet/soft-serve/server/config"
 	"github.com/charmbracelet/wish"
@@ -63,7 +64,7 @@ func NewServer(cfg *config.Config) *Server {
 					sh(s)
 				}
 			},
-			lm.Middleware(),
+			lm.MiddlewareWithLogger(log.StandardLog(log.StandardLogOption{ForceLevel: log.DebugLevel})),
 		),
 	}
 	s, err := wish.NewServer(
@@ -74,7 +75,7 @@ func NewServer(cfg *config.Config) *Server {
 		wish.WithMiddleware(mw...),
 	)
 	if err != nil {
-		log.Fatalln(err)
+		log.Fatal(err)
 	}
 	return &Server{
 		SSHServer: s,