go-ember-template/main.go

97 lines
2.5 KiB
Go
Raw Normal View History

2024-11-26 16:36:47 +00:00
package main
import (
"context"
"embed"
"io"
"net/http"
"os"
"os/signal"
"strings"
"syscall"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"gitlab.com/mstarongitlab/goutils/embedFsWrapper"
"gitlab.com/mstarongitlab/goutils/middleware"
)
//go:embed frontend/dist
var frontendFS embed.FS
func main() {
setLogger()
setLogLevel()
serverHandler := http.NewServeMux()
serverHandler.Handle(
"/",
http.FileServerFS(embedFsWrapper.NewFSWrapper(frontendFS, "frontend/dist/")),
)
// serverHandler := server.NewServer(embedFsWrapper.NewFSWrapper(frontendFS, "frontend/dist/"))
server := http.Server{
Handler: middleware.ChainMiddlewares(serverHandler, middleware.LoggingMiddleware),
Addr: *flagAddr,
}
// Setup exit notifications
exitSignalChannel := make(chan os.Signal, 2)
signal.Notify(exitSignalChannel, os.Interrupt, syscall.SIGTERM)
// Start the server in a separate goroutine so that main can handle shutdown
go func() {
log.Info().Str("addr", server.Addr).Msg("Starting server")
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal().Err(err).Msg("Server crashed!")
}
}()
// Wait for outside signal to close the server and stop the app
<-exitSignalChannel
// Close the server with a maximum timeout of 30 seconds
ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
defer cancel()
log.Info().Msg("Shutting down server")
err := server.Shutdown(ctx)
if err != nil {
log.Fatal().Err(err).Msg("Failed to cleanly stop server")
}
}
func setLogger(extraLogWriters ...io.Writer) {
if !*flagJsonLogging {
console := zerolog.ConsoleWriter{Out: os.Stderr}
log.Logger = zerolog.New(zerolog.MultiLevelWriter(append([]io.Writer{console}, extraLogWriters...)...)).
With().
Timestamp().
Logger()
} else {
log.Logger = zerolog.New(zerolog.MultiLevelWriter(
append([]io.Writer{log.Logger}, extraLogWriters...)...,
)).With().Timestamp().Logger()
}
}
func setLogLevel() {
switch strings.ToLower(*flagLogLevel) {
case "trace":
zerolog.SetGlobalLevel(zerolog.TraceLevel)
case "debug":
zerolog.SetGlobalLevel(zerolog.DebugLevel)
case "info":
zerolog.SetGlobalLevel(zerolog.InfoLevel)
case "warn":
zerolog.SetGlobalLevel(zerolog.WarnLevel)
case "error":
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
case "fatal":
zerolog.SetGlobalLevel(zerolog.FatalLevel)
default:
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}
log.Info().Str("new-level", *flagLogLevel).Msg("New log level set")
}