M go.mod => go.mod +1 -1
@@ 4,7 4,7 @@ go 1.21.0
require (
git.sr.ht/~emersion/go-scfg v0.0.0-20230601130942-e042ab15616e
- git.xenrox.net/~xenrox/go-log v0.0.0-20230813141354-3cf86abf0512
+ git.xenrox.net/~xenrox/go-utils v0.0.0-20230813142628-a8bdc9211a98
github.com/99designs/gqlgen v0.17.36
github.com/lib/pq v1.10.9
github.com/vektah/gqlparser/v2 v2.5.8
M go.sum => go.sum +2 -2
@@ 1,7 1,7 @@
git.sr.ht/~emersion/go-scfg v0.0.0-20230601130942-e042ab15616e h1:42zyo0ZFxHGkysM1B9EM7PnQNO0TEzPm+bw/2Zontyg=
git.sr.ht/~emersion/go-scfg v0.0.0-20230601130942-e042ab15616e/go.mod h1:ybgvEJTIx5XbaspSviB3KNa6OdPmAZqDoSud7z8fFlw=
-git.xenrox.net/~xenrox/go-log v0.0.0-20230813141354-3cf86abf0512 h1:v0gWNdBBvmPICyx29lm6zosPQzLyAZLxSn8hjaaWV2E=
-git.xenrox.net/~xenrox/go-log v0.0.0-20230813141354-3cf86abf0512/go.mod h1:d98WFDHGpxaEThKue5CfGtr9OrWgbaApprt3GH+OM4s=
+git.xenrox.net/~xenrox/go-utils v0.0.0-20230813142628-a8bdc9211a98 h1:c6B8yMLiPWj8Fqp3AeLBB86gKhdz2hfgAupaNpmMRMo=
+git.xenrox.net/~xenrox/go-utils v0.0.0-20230813142628-a8bdc9211a98/go.mod h1:BM4sMPD0fqFB6eG1T/7rGgEUiqZsMpHvq4PGE861Sfk=
github.com/99designs/gqlgen v0.17.36 h1:u/o/rv2SZ9s5280dyUOOrkpIIkr/7kITMXYD3rkJ9go=
github.com/99designs/gqlgen v0.17.36/go.mod h1:6RdyY8puhCoWAQVr2qzF2OMVfudQzc8ACxzpzluoQm4=
github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=
M graph/resolver.go => graph/resolver.go +3 -2
@@ 3,9 3,10 @@ package graph
//go:generate go run github.com/99designs/gqlgen generate
import (
+ "log/slog"
+
"git.xenrox.net/~xenrox/10man-api/config"
"git.xenrox.net/~xenrox/10man-api/database"
- "git.xenrox.net/~xenrox/go-log"
)
// This file will not be regenerated automatically.
@@ 15,7 16,7 @@ import (
type Resolver struct {
DB *database.DB
Config *config.Config
- Logger *log.Logger
+ Logger *slog.Logger
}
func (r *Resolver) playersInQueue() (int, error) {
M graph/schema.resolvers.go => graph/schema.resolvers.go +12 -5
@@ 11,6 11,7 @@ import (
"errors"
"fmt"
"io"
+ "log/slog"
"math/rand"
"net/http"
"time"
@@ 74,7 75,9 @@ func (r *mutationResolver) CreateUser(ctx context.Context, input model.NewUser)
return "", database.CheckErrorCode(err)
}
- r.Logger.Infof("Created user %q (SteamID %s, Elo %d).", name, input.SteamID, elo.Elo)
+ r.Logger.Info("Created user",
+ slog.String("ID", input.SteamID),
+ slog.Int("elo", elo.Elo))
return "Created", nil
}
@@ 90,7 93,9 @@ func (r *mutationResolver) DeleteUser(ctx context.Context, id int) (string, erro
return "", err
}
- r.Logger.Infof("Deleted user %q (SteamID %s)", name, steamID)
+ r.Logger.Info("Deleted user",
+ slog.String("name", name),
+ slog.String("ID", steamID))
return "Deleted", nil
}
@@ 163,7 168,9 @@ func (r *mutationResolver) UpdateUser(ctx context.Context, id int, input model.U
return nil, err
}
- r.Logger.Infof("Updated user with ID %d: %v", id, input)
+ r.Logger.Info("Updated user",
+ slog.Int("ID", id),
+ slog.Any("input", input))
return &user, nil
}
@@ 424,8 431,8 @@ func (r *mutationResolver) FinishMatch(ctx context.Context, winner string) (stri
if err != nil {
return "FinishFail", err
}
- r.Logger.Infof("%s won the match.", winner)
- r.Logger.Debugf("Team 1 got %d Elo, Team 2 got %d Elo.", delta1, delta2)
+ r.Logger.Info(fmt.Sprintf("%s won the match.", winner))
+ r.Logger.Debug(fmt.Sprintf("Team 1 got %d Elo, Team 2 got %d Elo.", delta1, delta2))
return "FinishSuccess", nil
}
M server.go => server.go +25 -12
@@ 2,6 2,8 @@ package main
import (
"flag"
+ "fmt"
+ "log/slog"
"net/http"
"os"
"os/signal"
@@ 11,7 13,7 @@ import (
"git.xenrox.net/~xenrox/10man-api/database"
"git.xenrox.net/~xenrox/10man-api/graph"
"git.xenrox.net/~xenrox/10man-api/graph/generated"
- "git.xenrox.net/~xenrox/go-log"
+ "git.xenrox.net/~xenrox/go-utils/logging"
"github.com/99designs/gqlgen/graphql/handler"
"github.com/99designs/gqlgen/graphql/playground"
)
@@ 24,20 26,25 @@ func main() {
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
- logger := log.NewDefaultLogger()
-
cfg, err := config.ReadConfig(configPath)
if err != nil {
- logger.Fatalf("config: %v", err)
+ slog.Error("Failed to read config",
+ slog.String("error", err.Error()))
+ os.Exit(1)
}
- if err := logger.SetLevelFromString(cfg.LogLevel); err != nil {
- logger.Errorf("config: %v", err)
+ logger, err := logging.New(cfg.LogLevel, "text", os.Stderr)
+ if err != nil {
+ slog.Error("Failed to create logger",
+ slog.String("error", err.Error()))
+ os.Exit(1)
}
db, err := database.Open(cfg.DBConnectionString)
if err != nil {
- logger.Fatal(err)
+ logger.Error("Failed to open database connection",
+ slog.String("error", err.Error()))
+ os.Exit(1)
}
srv := handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{
@@ 50,20 57,26 @@ func main() {
if cfg.EnablePlayground {
http.Handle("/", playground.Handler("GraphQL playground", "/query"))
- logger.Infof("connect to http://%s/ for GraphQL playground", cfg.HTTPAddress)
+ logger.Info(fmt.Sprintf("connect to http://%s/ for GraphQL playground", cfg.HTTPAddress))
}
http.Handle("/query", srv)
go func() {
- logger.Fatal(http.ListenAndServe(cfg.HTTPAddress, nil))
+ err = http.ListenAndServe(cfg.HTTPAddress, nil)
+ if err != nil {
+ logger.Error("Failed to start HTTP server",
+ slog.String("error", err.Error()))
+ os.Exit(1)
+ }
}()
shutdown(<-sigs, db, logger)
}
-func shutdown(sig os.Signal, db *database.DB, logger *log.Logger) {
+func shutdown(sig os.Signal, db *database.DB, logger *slog.Logger) {
+ logger.Info("Shutting down")
if err := db.DB.Close(); err != nil {
- logger.Fatalf("shutdown: %v", err)
+ logger.Error("Failed to close database connection",
+ slog.String("error", err.Error()))
}
- logger.Info("API was shut down")
}