Added setting for LogLevel

This commit is contained in:
Pijus Kamandulis
2025-01-09 21:07:41 +02:00
parent c2c9dc03b3
commit 8b8b087aab
14 changed files with 200 additions and 84 deletions

View File

@@ -26,7 +26,8 @@ func ParseFlags() ServerConfig {
disableAuthentication := flag.Bool("DisableAuth", false, "Disable authentication")
disableTls := flag.Bool("DisableTls", false, "Disable TLS, serve over HTTP")
persistDataPath := flag.String("Persist", "", "Saves data to given path on application exit")
debug := flag.Bool("Debug", false, "Runs application in debug mode, this provides additional logging")
logLevel := NewEnumValue("info", []string{"debug", "info", "error", "silent"})
flag.Var(logLevel, "LogLevel", fmt.Sprintf("Sets the logging level %s", logLevel.AllowedValuesList()))
flag.Parse()
setFlagsFromEnvironment()
@@ -41,8 +42,8 @@ func ParseFlags() ServerConfig {
config.PersistDataFilePath = *persistDataPath
config.DisableAuth = *disableAuthentication
config.DisableTls = *disableTls
config.Debug = *debug
config.AccountKey = *accountKey
config.LogLevel = logLevel.value
config.PopulateCalculatedFields()
@@ -54,7 +55,19 @@ func (c *ServerConfig) PopulateCalculatedFields() {
c.DatabaseDomain = c.Host
c.DatabaseEndpoint = fmt.Sprintf("https://%s:%d/", c.Host, c.Port)
c.ExplorerBaseUrlLocation = ExplorerBaseUrlLocation
logger.EnableDebugOutput = c.Debug
switch c.LogLevel {
case "debug":
logger.LogLevel = logger.LogLevelDebug
case "info":
logger.LogLevel = logger.LogLevelInfo
case "error":
logger.LogLevel = logger.LogLevelError
case "silent":
logger.LogLevel = logger.LogLevelSilent
default:
logger.LogLevel = logger.LogLevelInfo
}
}
func (c *ServerConfig) ApplyDefaultsToEmptyFields() {

36
api/config/enumFlag.go Normal file
View File

@@ -0,0 +1,36 @@
package config
import (
"fmt"
"strings"
)
type EnumValue struct {
allowedValues []string
value string
}
func (e *EnumValue) String() string {
return e.value
}
func (e *EnumValue) Set(v string) error {
for _, allowed := range e.allowedValues {
if v == allowed {
e.value = v
return nil
}
}
return fmt.Errorf("invalid value %q, must be one of: %s", v, strings.Join(e.allowedValues, ", "))
}
func NewEnumValue(defaultValue string, allowedValues []string) *EnumValue {
return &EnumValue{
allowedValues: allowedValues,
value: defaultValue,
}
}
func (e *EnumValue) AllowedValuesList() string {
return fmt.Sprintf("(one of: %s)", strings.Join(e.allowedValues, ", "))
}

View File

@@ -15,6 +15,6 @@ type ServerConfig struct {
PersistDataFilePath string `json:"persistDataFilePath"`
DisableAuth bool `json:"disableAuth"`
DisableTls bool `json:"disableTls"`
Debug bool `json:"debug"`
LogLevel string `json:"logLevel"`
ExplorerBaseUrlLocation string `json:"explorerBaseUrlLocation"`
}

View File

@@ -135,7 +135,7 @@ func (h *Handlers) PatchDocument(c *gin.Context) {
currentDocumentBytes, err := json.Marshal(document)
if err != nil {
logger.Error("Failed to marshal existing document:", err)
logger.ErrorLn("Failed to marshal existing document:", err)
c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to marshal existing document"})
return
}
@@ -149,7 +149,7 @@ func (h *Handlers) PatchDocument(c *gin.Context) {
var modifiedDocument map[string]interface{}
err = json.Unmarshal(modifiedDocumentBytes, &modifiedDocument)
if err != nil {
logger.Error("Failed to unmarshal modified document:", err)
logger.ErrorLn("Failed to unmarshal modified document:", err)
c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to unmarshal modified document"})
return
}

View File

@@ -16,7 +16,7 @@ func RequestLogger() gin.HandlerFunc {
bodyStr := readBody(rdr1)
if bodyStr != "" {
logger.Debug(bodyStr)
logger.DebugLn(bodyStr)
}
c.Request.Body = rdr2

View File

@@ -16,7 +16,10 @@ import (
func (s *ApiServer) CreateRouter(repository *repositories.DataRepository) {
routeHandlers := handlers.NewHandlers(repository, s.config)
if !s.config.Debug {
gin.DefaultWriter = logger.InfoWriter()
gin.DefaultErrorWriter = logger.ErrorWriter()
if s.config.LogLevel != "debug" {
gin.SetMode(gin.ReleaseMode)
}
@@ -24,7 +27,7 @@ func (s *ApiServer) CreateRouter(repository *repositories.DataRepository) {
e.RedirectTrailingSlash = false
})
if s.config.Debug {
if s.config.LogLevel == "debug" {
router.Use(middleware.RequestLogger())
}
@@ -89,10 +92,10 @@ func (s *ApiServer) Start() {
go func() {
<-s.stopServer
logger.Info("Shutting down server...")
logger.InfoLn("Shutting down server...")
err := server.Shutdown(context.TODO())
if err != nil {
logger.Error("Failed to shutdown server:", err)
logger.ErrorLn("Failed to shutdown server:", err)
}
}()
@@ -101,7 +104,7 @@ func (s *ApiServer) Start() {
logger.Infof("Listening and serving HTTP on %s\n", server.Addr)
err := server.ListenAndServe()
if err != nil {
logger.Error("Failed to start HTTP server:", err)
logger.ErrorLn("Failed to start HTTP server:", err)
}
s.isActive = false
} else if s.config.TLS_CertificatePath != "" && s.config.TLS_CertificateKey != "" {
@@ -110,7 +113,7 @@ func (s *ApiServer) Start() {
s.config.TLS_CertificatePath,
s.config.TLS_CertificateKey)
if err != nil {
logger.Error("Failed to start HTTPS server:", err)
logger.ErrorLn("Failed to start HTTPS server:", err)
}
s.isActive = false
} else {
@@ -120,7 +123,7 @@ func (s *ApiServer) Start() {
logger.Infof("Listening and serving HTTPS on %s\n", server.Addr)
err := server.ListenAndServeTLS("", "")
if err != nil {
logger.Error("Failed to start HTTPS server:", err)
logger.ErrorLn("Failed to start HTTPS server:", err)
}
s.isActive = false
}