From: gyuyoung Date: Sat, 14 Dec 2024 17:49:29 +0000 (+0900) Subject: Update the logger of Modelmgmtservice X-Git-Tag: 4.0.0~16 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=e3d4eab7e0307051708e767c7f9c22a5bcd79bbb;p=aiml-fw%2Fawmf%2Fmodelmgmtservice.git Update the logger of Modelmgmtservice - 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 --- diff --git a/go.mod b/go.mod index f2f4848..17fd0a6 100644 --- 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 --- 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 index 0000000..79acd2d --- /dev/null +++ b/logging/slogger.go @@ -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)) + } + }) +}