summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/api/main.go5
-rw-r--r--internal/api/handlers/handlers.go14
-rw-r--r--internal/logger/logger.go43
-rw-r--r--internal/network/ip.go6
-rw-r--r--internal/network/network.go49
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
}