Update the logger of Modelmgmtservice 75/13875/3
authorgyuyoung <gyoue200125@gmail.com>
Sat, 14 Dec 2024 17:49:29 +0000 (02:49 +0900)
committersubhash kumar singh <subh.singh@samsung.com>
Mon, 23 Dec 2024 10:43:41 +0000 (16:13 +0530)
- Add 'slog' logger in modelmgmtservice
- Ability to change log output format (e.g., JSON, text)
- Log file rotation functionality
- Logging to stdout
- Logging filter based on log levels

Issue-ID: AIMLFW-172

Change-Id: I56f3e0de3632eeed00366c9e531f8e85284c73b6
Signed-off-by: gyuyoung <gyoue200125@gmail.com>
go.mod
go.sum
logging/slogger.go [new file with mode: 0644]

diff --git a/go.mod b/go.mod
index f2f4848..17fd0a6 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -7,9 +7,11 @@ toolchain go1.23.2
 require (
        github.com/aws/aws-sdk-go v1.47.3
        github.com/gin-gonic/gin v1.9.1
+       github.com/go-playground/validator/v10 v10.14.0
        github.com/google/uuid v1.6.0
        github.com/spf13/viper v1.19.0
        github.com/stretchr/testify v1.9.0
+       gopkg.in/natefinch/lumberjack.v2 v2.2.1
        gorm.io/driver/postgres v1.5.9
        gorm.io/gorm v1.25.12
 )
@@ -23,7 +25,6 @@ require (
        github.com/gin-contrib/sse v0.1.0 // indirect
        github.com/go-playground/locales v0.14.1 // indirect
        github.com/go-playground/universal-translator v0.18.1 // indirect
-       github.com/go-playground/validator/v10 v10.14.0 // indirect
        github.com/goccy/go-json v0.10.2 // indirect
        github.com/hashicorp/hcl v1.0.0 // indirect
        github.com/jackc/pgpassfile v1.0.0 // indirect
@@ -46,6 +47,8 @@ require (
        github.com/rogpeppe/go-internal v1.13.1 // indirect
        github.com/sagikazarmark/locafero v0.4.0 // indirect
        github.com/sagikazarmark/slog-shim v0.1.0 // indirect
+       github.com/samber/lo v1.47.0 // indirect
+       github.com/samber/slog-multi v1.2.4 // indirect
        github.com/sourcegraph/conc v0.3.0 // indirect
        github.com/spf13/afero v1.11.0 // indirect
        github.com/spf13/cast v1.6.0 // indirect
@@ -60,9 +63,9 @@ require (
        golang.org/x/crypto v0.21.0 // indirect
        golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
        golang.org/x/net v0.23.0 // indirect
-       golang.org/x/sync v0.6.0 // indirect
+       golang.org/x/sync v0.8.0 // indirect
        golang.org/x/sys v0.21.0 // indirect
-       golang.org/x/text v0.14.0 // indirect
+       golang.org/x/text v0.18.0 // indirect
        google.golang.org/protobuf v1.33.0 // indirect
        gopkg.in/ini.v1 v1.67.0 // indirect
        gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/go.sum b/go.sum
index b23e795..03b0db3 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -86,6 +86,10 @@ github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6ke
 github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
 github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
 github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
+github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
+github.com/samber/slog-multi v1.2.4 h1:k9x3JAWKJFPKffx+oXZ8TasaNuorIW4tG+TXxkt6Ry4=
+github.com/samber/slog-multi v1.2.4/go.mod h1:ACuZ5B6heK57TfMVkVknN2UZHoFfjCwRxR0Q2OXKHlo=
 github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
 github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
 github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
@@ -129,14 +133,14 @@ golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjs
 golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
 golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
 golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
-golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
 golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
+golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -144,6 +148,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
 gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/logging/slogger.go b/logging/slogger.go
new file mode 100644 (file)
index 0000000..79acd2d
--- /dev/null
@@ -0,0 +1,76 @@
+package logging
+
+import (
+       "errors"
+       "log/slog"
+       "os"
+       "strings"
+       "sync"
+
+       slogmulti "github.com/samber/slog-multi"
+       "gopkg.in/natefinch/lumberjack.v2"
+)
+
+type logLevel string
+
+var (
+       LOG_LEVEL_DEBUG logLevel = "DEBUG"
+       LOG_LEVEL_INFO  logLevel = "INFO"
+       LOG_LEVEL_WARN  logLevel = "WARN"
+       LOG_LEVEL_ERROR logLevel = "ERROR"
+)
+
+func (l logLevel) convertLogLevelToSlogLogLevel() slog.Level {
+       switch l {
+       case LOG_LEVEL_DEBUG:
+               return slog.LevelDebug
+       case LOG_LEVEL_INFO:
+               return slog.LevelInfo
+       case LOG_LEVEL_WARN:
+               return slog.LevelWarn
+       case LOG_LEVEL_ERROR:
+               return slog.LevelError
+       default:
+               return slog.LevelInfo
+       }
+}
+
+func parseLogLevel(level string) (logLevel, error) {
+       switch strings.ToUpper(level) {
+       case string(LOG_LEVEL_DEBUG), string(LOG_LEVEL_INFO), string(LOG_LEVEL_WARN), string(LOG_LEVEL_ERROR):
+               return logLevel(level), nil
+       default:
+               return LOG_LEVEL_INFO, errors.New("invalid log level, set default log level 'INFO'")
+       }
+}
+
+var (
+       Logger *slog.Logger
+       once   sync.Once
+)
+
+func Load(logLevel string, filename string) {
+       once.Do(func() {
+               parsedLogLevel, err := parseLogLevel(logLevel)
+               fileRotationLogger := lumberjack.Logger{
+                       Filename:   filename,
+                       MaxSize:    100, // 100MB
+                       MaxBackups: 5,
+                       MaxAge:     30,
+                       Compress:   true,
+               }
+
+               logHandlerOpt := slog.HandlerOptions{
+                       Level:     parsedLogLevel.convertLogLevelToSlogLogLevel(),
+                       AddSource: true,
+               }
+
+               fileLogHandler := slog.NewJSONHandler(&fileRotationLogger, &logHandlerOpt)
+               stdoutLogHandler := slog.NewTextHandler(os.Stdout, &logHandlerOpt)
+
+               Logger = slog.New(slogmulti.Fanout(fileLogHandler, stdoutLogHandler)).With(slog.String("app", "mmes"))
+               if err != nil {
+                       Logger.Error("error occurred: ", slog.Any("error", err))
+               }
+       })
+}