diff options
author | Santo Cariotti <santo@dcariotti.me> | 2025-04-08 16:27:47 +0200 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2025-04-08 16:27:47 +0200 |
commit | e530502c7c5554b8f7c669cbde1bd2175d077a19 (patch) | |
tree | 4e12ebe94dc5f4ef790abe1e656d0b9befc57406 | |
parent | 1e0c611290cdeab4cf263de4f62f99dd125ba428 (diff) |
Use logger with zap only
-rw-r--r-- | cmd/api/main.go | 5 | ||||
-rw-r--r-- | internal/api/handlers/handlers.go | 14 | ||||
-rw-r--r-- | internal/logger/logger.go | 43 | ||||
-rw-r--r-- | internal/network/ip.go | 6 | ||||
-rw-r--r-- | internal/network/network.go | 49 |
5 files changed, 71 insertions, 46 deletions
diff --git a/cmd/api/main.go b/cmd/api/main.go index 633f339..1fcd4d1 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -1,19 +1,20 @@ package main import ( - "log/slog" "net/http" "os" "github.com/boozec/rahanna/internal/api/database" "github.com/boozec/rahanna/internal/api/handlers" "github.com/boozec/rahanna/internal/api/middleware" + "github.com/boozec/rahanna/internal/logger" "github.com/gorilla/mux" "github.com/rs/cors" ) func main() { database.InitDb(os.Getenv("DATABASE_URL")) + log := logger.InitLogger("rahanna.log") r := mux.NewRouter() r.HandleFunc("/auth/register", handlers.RegisterUser).Methods(http.MethodPost) @@ -21,7 +22,7 @@ func main() { r.Handle("/play", middleware.AuthMiddleware(http.HandlerFunc(handlers.NewPlay))).Methods(http.MethodPost) r.Handle("/enter-game", middleware.AuthMiddleware(http.HandlerFunc(handlers.EnterGame))).Methods(http.MethodPost) - slog.Info("Serving on :8080") + log.Info("Serving on :8080") handler := cors.AllowAll().Handler(r) if err := http.ListenAndServe(":8080", handler); err != nil { panic(err) diff --git a/internal/api/handlers/handlers.go b/internal/api/handlers/handlers.go index b448502..4f668cd 100644 --- a/internal/api/handlers/handlers.go +++ b/internal/api/handlers/handlers.go @@ -2,12 +2,12 @@ package handlers import ( "encoding/json" - "log/slog" "net/http" "time" "github.com/boozec/rahanna/internal/api/auth" "github.com/boozec/rahanna/internal/api/database" + "github.com/boozec/rahanna/internal/logger" "github.com/boozec/rahanna/internal/network" "gorm.io/gorm" ) @@ -17,7 +17,8 @@ type NewGameRequest struct { } func RegisterUser(w http.ResponseWriter, r *http.Request) { - slog.Info("POST /auth/register") + log, _ := logger.GetLogger() + log.Info("POST /auth/register") var user database.User err := json.NewDecoder(r.Body).Decode(&user) if err != nil { @@ -62,7 +63,8 @@ func RegisterUser(w http.ResponseWriter, r *http.Request) { } func LoginUser(w http.ResponseWriter, r *http.Request) { - slog.Info("POST /auth/login") + log, _ := logger.GetLogger() + log.Info("POST /auth/login") var inputUser database.User err := json.NewDecoder(r.Body).Decode(&inputUser) if err != nil { @@ -94,7 +96,8 @@ func LoginUser(w http.ResponseWriter, r *http.Request) { } func NewPlay(w http.ResponseWriter, r *http.Request) { - slog.Info("POST /play") + log, _ := logger.GetLogger() + log.Info("POST /play") claims, err := auth.ValidateJWT(r.Header.Get("Authorization")) if err != nil { @@ -137,7 +140,8 @@ func NewPlay(w http.ResponseWriter, r *http.Request) { } func EnterGame(w http.ResponseWriter, r *http.Request) { - slog.Info("POST /enter-game") + log, _ := logger.GetLogger() + log.Info("POST /enter-game") claims, err := auth.ValidateJWT(r.Header.Get("Authorization")) if err != nil { diff --git a/internal/logger/logger.go b/internal/logger/logger.go new file mode 100644 index 0000000..a5d0264 --- /dev/null +++ b/internal/logger/logger.go @@ -0,0 +1,43 @@ +package logger + +import ( + "errors" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "gopkg.in/natefinch/lumberjack.v2" +) + +var logger *zap.Logger = nil + +func InitLogger(logFile string) *zap.Logger { + cfg := zap.NewProductionConfig() + cfg.OutputPaths = []string{logFile} + cfg.ErrorOutputPaths = []string{logFile} + + // Configure lumberjack for log rotation + lumberjackLogger := &lumberjack.Logger{ + Filename: logFile, + MaxSize: 100, // megabytes + MaxBackups: 5, + MaxAge: 30, // days + Compress: true, + } + + core := zapcore.NewCore( + zapcore.NewJSONEncoder(cfg.EncoderConfig), + zapcore.AddSync(lumberjackLogger), // Log only to the file via lumberjack + cfg.Level, + ) + + logger = zap.New(core) + + return logger +} + +func GetLogger() (*zap.Logger, error) { + if logger == nil { + return nil, errors.New("You must call `InitLogger()` first.") + } + return logger, nil +} diff --git a/internal/network/ip.go b/internal/network/ip.go index 0c6451e..dcd15db 100644 --- a/internal/network/ip.go +++ b/internal/network/ip.go @@ -2,15 +2,17 @@ package network import ( "fmt" - "log/slog" "math/rand" "net" + + "github.com/boozec/rahanna/internal/logger" ) func GetOutboundIP() net.IP { + log, _ := logger.GetLogger() conn, err := net.Dial("udp", "8.8.8.8:80") if err != nil { - slog.Error("err", err) + log.Sugar().Error("err", err) } defer conn.Close() diff --git a/internal/network/network.go b/internal/network/network.go index efd7dc6..247ce70 100644 --- a/internal/network/network.go +++ b/internal/network/network.go @@ -8,13 +8,10 @@ import ( "sync" "time" + "github.com/boozec/rahanna/internal/logger" "go.uber.org/zap" - "go.uber.org/zap/zapcore" - "gopkg.in/natefinch/lumberjack.v2" ) -var logger *zap.Logger - // PeerInfo represents a peer's ID and IP. type PeerInfo struct { ID string `json:"id"` @@ -42,6 +39,7 @@ type TCPNetwork struct { callbacksMu sync.RWMutex isConnected bool retryDelay time.Duration + logger *zap.Logger sync.Mutex } @@ -53,37 +51,14 @@ func NewTCPNetwork(localID, localIP string, localPort int) *TCPNetwork { callbacks: make(map[string]NetworkCallback), isConnected: false, retryDelay: 2 * time.Second, + logger: logger.InitLogger("rahanna.log"), } - n.setupLogger("rahanna-network.log") go n.startServer() return n } -func (n *TCPNetwork) setupLogger(logFile string) { - cfg := zap.NewProductionConfig() - cfg.OutputPaths = []string{logFile} - cfg.ErrorOutputPaths = []string{logFile} - - // Configure lumberjack for log rotation - lumberjackLogger := &lumberjack.Logger{ - Filename: logFile, - MaxSize: 100, // megabytes - MaxBackups: 5, - MaxAge: 30, // days - Compress: true, - } - - core := zapcore.NewCore( - zapcore.NewJSONEncoder(cfg.EncoderConfig), - zapcore.AddSync(lumberjackLogger), // Log only to the file via lumberjack - cfg.Level, - ) - - logger = zap.New(core) -} - // Add a new peer connection to the local peer func (n *TCPNetwork) AddPeer(remoteID string, remoteIP string, remotePort int) { go n.retryConnect(remoteID, remoteIP, remotePort) @@ -94,16 +69,16 @@ func (n *TCPNetwork) startServer() { address := fmt.Sprintf("%s:%d", n.localPeer.IP, n.localPeer.Port) listener, err := net.Listen("tcp", address) if err != nil { - logger.Sugar().Errorf("failed to start server: %v", err) + n.logger.Sugar().Errorf("failed to start server: %v", err) return } n.listener = listener - logger.Sugar().Infof("server started on %s\n", address) + n.logger.Sugar().Infof("server started on %s\n", address) for { conn, err := listener.Accept() if err != nil { - logger.Sugar().Errorf("failed to accept connection: %v\n", err) + n.logger.Sugar().Errorf("failed to accept connection: %v\n", err) continue } @@ -114,7 +89,7 @@ func (n *TCPNetwork) startServer() { n.isConnected = true n.retryDelay = 2 * time.Second - logger.Sugar().Infof("connected to remote peer %s\n", remoteAddr) + n.logger.Sugar().Infof("connected to remote peer %s\n", remoteAddr) go n.listenForMessages(conn) } } @@ -135,7 +110,7 @@ func (n *TCPNetwork) retryConnect(remoteID, remoteIP string, remotePort int) { conn, err := net.Dial("tcp", address) if err != nil { - logger.Sugar().Errorf("failed to connect to %s: %v. Retrying in %v...", remoteID, err, n.retryDelay) + n.logger.Sugar().Errorf("failed to connect to %s: %v. Retrying in %v...", remoteID, err, n.retryDelay) time.Sleep(n.retryDelay) if n.retryDelay < 30*time.Second { n.retryDelay *= 2 @@ -146,7 +121,7 @@ func (n *TCPNetwork) retryConnect(remoteID, remoteIP string, remotePort int) { n.Lock() n.connections[remoteID] = conn n.Unlock() - logger.Sugar().Infof("successfully connected to peer %s!", remoteID) + n.logger.Sugar().Infof("successfully connected to peer %s!", remoteID) go n.listenForMessages(conn) } @@ -177,7 +152,7 @@ func (n *TCPNetwork) Send(remoteID, messageType string, payload []byte) error { _, err = conn.Write(append(data, '\n')) if err != nil { - logger.Sugar().Errorf("failed to send message to %s: %v. Reconnecting...", remoteID, err) + n.logger.Sugar().Errorf("failed to send message to %s: %v. Reconnecting...", remoteID, err) n.Lock() delete(n.connections, remoteID) n.Unlock() @@ -202,7 +177,7 @@ func (n *TCPNetwork) listenForMessages(conn net.Conn) { for { data, err := reader.ReadBytes('\n') if err != nil { - logger.Debug("connection lost. Reconnecting...") + n.logger.Debug("connection lost. Reconnecting...") n.Lock() for id, c := range n.connections { if c == conn { @@ -217,7 +192,7 @@ func (n *TCPNetwork) listenForMessages(conn net.Conn) { var message Message if err := json.Unmarshal(data, &message); err != nil { - logger.Sugar().Errorf("failed to unmarshal message: %v\n", err) + n.logger.Sugar().Errorf("failed to unmarshal message: %v\n", err) continue } |