From 396ca08381d81423a1ab37b83f02a3d6e17b7871 Mon Sep 17 00:00:00 2001 From: Hayden Hargreaves Date: Tue, 27 Jan 2026 12:36:30 -0700 Subject: [PATCH] (FIX): Needed some work on the logging and handlers. --- .gitignore | 1 + cmd/web/main.go | 6 +- internal/app/server/server.go | 55 +++++++++++++++---- .../logging/loggers/file_logger.go | 3 + 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 73d85a6..958b6f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /flake.lock /.env /*.dump +/*.log diff --git a/cmd/web/main.go b/cmd/web/main.go index 56c437e..66e563f 100644 --- a/cmd/web/main.go +++ b/cmd/web/main.go @@ -1,12 +1,12 @@ package main -import "github.com/haydenhargreaves/Potion/internal/app/server" +import ( + "github.com/haydenhargreaves/Potion/internal/app/server" +) const PORT = 3000 func main() { s := server.Init(PORT).Setup() - defer s.DB.Close() - s.Start() } diff --git a/internal/app/server/server.go b/internal/app/server/server.go index f78c781..16c0387 100644 --- a/internal/app/server/server.go +++ b/internal/app/server/server.go @@ -4,7 +4,10 @@ import ( "database/sql" "fmt" "net/http" + "os" + "os/signal" "strings" + "syscall" "github.com/a-h/templ/examples/integration-gin/gintemplrenderer" "github.com/gin-contrib/cors" @@ -20,22 +23,24 @@ import ( ) type Server struct { - port int - Router *gin.Engine - config cors.Config - DB *sql.DB - deps domain.InjectedDependencies - logs []logging.Logger + port int + Router *gin.Engine + config cors.Config + DB *sql.DB + deps domain.InjectedDependencies + logs []logging.Logger + cleanupFuncs []func() error } // Init initializes the server with the provided port. CORS settings are defined here. // A pointer to a server object is returned which allows for method chaining. func Init(port int) *Server { server := &Server{ - Router: gin.New(), // Not default anymore, to allow for custom logger - port: port, - config: cors.DefaultConfig(), - logs: []logging.Logger{}, + Router: gin.New(), // Not default anymore, to allow for custom logger + port: port, + config: cors.DefaultConfig(), + logs: []logging.Logger{}, + cleanupFuncs: []func() error{}, } // Default logger which logs everything @@ -66,7 +71,33 @@ func Init(port int) *Server { // Start starts the server on the port provided when the server was initialized func (s *Server) Start() { logging.LogAll(s.logs, logging.LogLevelDebug, "Server started on :%d\n", s.port) - s.Router.Run(fmt.Sprintf(":%d", s.port)) + + // Create channel that only listens for SIGINT and SIGTERM + quit := make(chan os.Signal, 1) + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + + go func() { + if err := s.Router.Run(fmt.Sprintf(":%d", s.port)); err != nil { + logging.LogAll(s.logs, logging.LogLevelFatal, "Server failed: %s\n", err) + } + }() + + // Block until we get a message on the quit channel + <-quit + logging.LogAll(s.logs, logging.LogLevelInfo, "Shutting down server...\n") + + s.cleanup() + logging.LogAll(s.logs, logging.LogLevelInfo, "Server exited\n") +} + +func (s *Server) cleanup() { + for _, cleanup := range s.cleanupFuncs { + // NOTE: Ignoring error + cleanup() + } + if s.DB != nil { + s.DB.Close() + } } // TODO: (9/4/2025) Abstract these functions and cleanup. This is fucking messy... @@ -121,7 +152,7 @@ func (s *Server) Setup() *Server { } else { logging.LogAll(s.logs, logging.LogLevelDebug, "Initialized file logger on file '%s'\n", cfg.LogFilePath) s.logs = append(s.logs, fileLogger) - defer cleanup() + s.cleanupFuncs = append(s.cleanupFuncs, cleanup) } } diff --git a/internal/infrastructure/logging/loggers/file_logger.go b/internal/infrastructure/logging/loggers/file_logger.go index c125d96..d2a0631 100644 --- a/internal/infrastructure/logging/loggers/file_logger.go +++ b/internal/infrastructure/logging/loggers/file_logger.go @@ -11,6 +11,7 @@ import ( type FileLogger struct { writer io.Writer + file *os.File filter logging.LogLevel } @@ -34,6 +35,7 @@ func NewFileLogger(filepath string, filter logging.LogLevel) (logging.Logger, fu logger := &FileLogger{ writer: f, + file: f, filter: filter, } @@ -55,4 +57,5 @@ func (l *FileLogger) Log(level logging.LogLevel, format string, v ...any) { fullFormat := fmt.Sprintf("%-13s %s | %s\n", "["+level+"]", timestamp, format) bytes := fmt.Appendf(nil, fullFormat, v...) l.writer.Write(bytes) + l.file.Sync() } -- 2.47.2