diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-15 11:20:24 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-15 11:20:24 +0900 |
| commit | a6b88139afc7c994ddb604757304d44214c00a90 (patch) | |
| tree | bf24da786c5fb292991fd1ad893522601ce98aa4 /backend | |
| parent | 96fad1a4e78c7209e5a0f3496e8b59d591fbe500 (diff) | |
| download | phperkaigi-2026-albatross-a6b88139afc7c994ddb604757304d44214c00a90.tar.gz phperkaigi-2026-albatross-a6b88139afc7c994ddb604757304d44214c00a90.tar.zst phperkaigi-2026-albatross-a6b88139afc7c994ddb604757304d44214c00a90.zip | |
refactor(log): migrate from log to log/slog for structured logging
Replace all usages of the standard log package with log/slog across
backend and swift worker. Configure Echo's request logger to emit
structured log attributes via slog instead of the default format.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/admin/handler.go | 4 | ||||
| -rw-r--r-- | backend/api/handler.go | 4 | ||||
| -rw-r--r-- | backend/auth/auth.go | 4 | ||||
| -rw-r--r-- | backend/game/hub.go | 6 | ||||
| -rw-r--r-- | backend/main.go | 39 |
5 files changed, 42 insertions, 15 deletions
diff --git a/backend/admin/handler.go b/backend/admin/handler.go index a18e32a..ef19f21 100644 --- a/backend/admin/handler.go +++ b/backend/admin/handler.go @@ -3,7 +3,7 @@ package admin import ( "context" "errors" - "log" + "log/slog" "net/http" "strconv" "time" @@ -268,7 +268,7 @@ func (h *Handler) postUserFetchIcon(c echo.Context) error { go func() { err := account.FetchIcon(context.Background(), h.q, int(row.UserID)) if err != nil { - log.Printf("%v", err) + slog.Error("failed to fetch icon", "error", err) // The failure is intentionally ignored. Retry manually if needed. } }() diff --git a/backend/api/handler.go b/backend/api/handler.go index 9f8849c..05a185a 100644 --- a/backend/api/handler.go +++ b/backend/api/handler.go @@ -4,7 +4,7 @@ import ( "context" "encoding/json" "errors" - "log" + "log/slog" "net/http" "strconv" "time" @@ -47,7 +47,7 @@ func (h *Handler) PostLogin(ctx context.Context, request PostLoginRequestObject) password := request.Body.Password userID, err := auth.Login(ctx, h.q, username, password) if err != nil { - log.Printf("login failed: %v", err) + slog.Error("login failed", "error", err) var msg string if errors.Is(err, auth.ErrForteeLoginTimeout) { msg = "ログインに失敗しました" diff --git a/backend/auth/auth.go b/backend/auth/auth.go index d5264ec..babbe68 100644 --- a/backend/auth/auth.go +++ b/backend/auth/auth.go @@ -3,7 +3,7 @@ package auth import ( "context" "errors" - "log" + "log/slog" "time" "github.com/jackc/pgx/v5" @@ -93,7 +93,7 @@ func signup( go func() { err := account.FetchIcon(context.Background(), queries, int(userID)) if err != nil { - log.Printf("%v", err) + slog.Error("failed to fetch icon", "error", err) // The failure is intentionally ignored. Retry manually if needed. } }() diff --git a/backend/game/hub.go b/backend/game/hub.go index 910911a..9ae725a 100644 --- a/backend/game/hub.go +++ b/backend/game/hub.go @@ -2,7 +2,8 @@ package game import ( "context" - "log" + "log/slog" + "os" "regexp" "strings" @@ -29,7 +30,8 @@ func NewGameHub(q *db.Queries, taskQueue *taskqueue.Queue, taskWorker *taskqueue func (hub *Hub) Run() { go func() { if err := hub.taskWorker.Run(); err != nil { - log.Fatal(err) + slog.Error("task worker failed", "error", err) + os.Exit(1) } }() diff --git a/backend/main.go b/backend/main.go index c1b670a..ac996f0 100644 --- a/backend/main.go +++ b/backend/main.go @@ -3,8 +3,9 @@ package main import ( "context" "fmt" - "log" + "log/slog" "net/http" + "os" "time" "github.com/jackc/pgx/v5/pgxpool" @@ -39,12 +40,14 @@ func main() { var err error conf, err := config.NewConfigFromEnv() if err != nil { - log.Fatalf("Error loading env %v", err) + slog.Error("failed to load env", "error", err) + os.Exit(1) } openAPISpec, err := api.GetSwaggerWithPrefix(conf.BasePath + "api") if err != nil { - log.Fatalf("Error loading OpenAPI spec\n: %s", err) + slog.Error("failed to load OpenAPI spec", "error", err) + os.Exit(1) } ctx := context.Background() @@ -52,7 +55,8 @@ func main() { dbDSN := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", conf.DBHost, conf.DBPort, conf.DBUser, conf.DBPassword, conf.DBName) connPool, err := connectDB(ctx, dbDSN) if err != nil { - log.Fatalf("Error connecting to db %v", err) + slog.Error("failed to connect to db", "error", err) + os.Exit(1) } defer connPool.Close() @@ -61,7 +65,27 @@ func main() { e := echo.New() e.Renderer = admin.NewRenderer() - e.Use(middleware.RequestLogger()) + e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{ + LogStatus: true, + LogURI: true, + LogMethod: true, + LogLatency: true, + LogError: true, + HandleError: true, + LogValuesFunc: func(_ echo.Context, v middleware.RequestLoggerValues) error { + attrs := []slog.Attr{ + slog.String("method", v.Method), + slog.String("uri", v.URI), + slog.Int("status", v.Status), + slog.Duration("latency", v.Latency), + } + if v.Error != nil { + attrs = append(attrs, slog.String("error", v.Error.Error())) + } + slog.LogAttrs(context.Background(), slog.LevelInfo, "request", attrs...) + return nil + }, + })) e.Use(middleware.Recover()) taskQueue := taskqueue.NewQueue("task-db:6379") @@ -116,7 +140,7 @@ func main() { return case <-ticker.C: if err := queries.DeleteExpiredSessions(sessionCleanupCtx); err != nil { - log.Printf("failed to delete expired sessions: %v", err) + slog.Error("failed to delete expired sessions", "error", err) } } } @@ -125,6 +149,7 @@ func main() { go gameHub.Run() if err := e.Start(":80"); err != http.ErrServerClosed { - log.Fatal(err) + slog.Error("failed to start server", "error", err) + os.Exit(1) } } |
