aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-15 11:20:24 +0900
committernsfisis <nsfisis@gmail.com>2026-02-15 11:20:24 +0900
commita6b88139afc7c994ddb604757304d44214c00a90 (patch)
treebf24da786c5fb292991fd1ad893522601ce98aa4 /backend
parent96fad1a4e78c7209e5a0f3496e8b59d591fbe500 (diff)
downloadphperkaigi-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.go4
-rw-r--r--backend/api/handler.go4
-rw-r--r--backend/auth/auth.go4
-rw-r--r--backend/game/hub.go6
-rw-r--r--backend/main.go39
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)
}
}