@@ -3,12 +3,13 @@ package di
33import (
44 "context"
55 "fmt"
6- "io"
7- "log"
86 "os"
7+ "strconv"
98 "time"
109
1110 "firebase.google.com/go/messaging"
11+ "github.com/hirosassa/zerodriver"
12+ "github.com/rs/zerolog"
1213
1314 firebase "firebase.google.com/go"
1415 "firebase.google.com/go/auth"
@@ -30,7 +31,6 @@ import (
3031 "github.com/NdoleStudio/http-sms-manager/pkg/handlers"
3132 "github.com/NdoleStudio/http-sms-manager/pkg/telemetry"
3233 "github.com/NdoleStudio/http-sms-manager/pkg/validators"
33- "github.com/rs/zerolog"
3434 "gorm.io/driver/postgres"
3535 gormLogger "gorm.io/gorm/logger"
3636)
@@ -48,7 +48,7 @@ type Container struct {
4848func NewContainer (projectID string ) (container * Container ) {
4949 container = & Container {
5050 projectID : projectID ,
51- logger : logger ().WithService (fmt .Sprintf ("%T" , container )),
51+ logger : logger (3 ).WithService (fmt .Sprintf ("%T" , container )),
5252 }
5353
5454 container .RegisterMessageListeners ()
@@ -109,9 +109,21 @@ func (container *Container) AuthRouter() fiber.Router {
109109}
110110
111111// Logger creates a new instance of telemetry.Logger
112- func (container * Container ) Logger () telemetry.Logger {
112+ func (container * Container ) Logger (skipFrameCount ... int ) telemetry.Logger {
113113 container .logger .Debug ("creating telemetry.Logger" )
114- return logger ()
114+ if len (skipFrameCount ) > 0 {
115+ return logger (skipFrameCount [0 ])
116+ }
117+ return logger (3 )
118+ }
119+
120+ // GormLogger creates a new instance of gormLogger.Interface
121+ func (container * Container ) GormLogger () gormLogger.Interface {
122+ container .logger .Debug ("creating gormLogger.Interface" )
123+ return telemetry .NewGormLogger (
124+ container .Tracer (),
125+ container .Logger (6 ),
126+ )
115127}
116128
117129// DB creates an instance of gorm.DB if it has not been created already
@@ -122,14 +134,7 @@ func (container *Container) DB() (db *gorm.DB) {
122134
123135 container .logger .Debug (fmt .Sprintf ("creating %T" , db ))
124136
125- gl := gormLogger .New (log .New (os .Stdout , "\r \n " , log .LstdFlags ), gormLogger.Config {
126- SlowThreshold : 200 * time .Millisecond ,
127- LogLevel : gormLogger .Info ,
128- IgnoreRecordNotFoundError : false ,
129- Colorful : true ,
130- })
131-
132- db , err := gorm .Open (postgres .Open (os .Getenv ("DATABASE_URL" )), & gorm.Config {Logger : gl })
137+ db , err := gorm .Open (postgres .Open (os .Getenv ("DATABASE_URL" )), & gorm.Config {Logger : container .GormLogger ()})
133138 if err != nil {
134139 container .logger .Fatal (err )
135140 }
@@ -559,29 +564,63 @@ func (container *Container) UserRepository() repositories.UserRepository {
559564 )
560565}
561566
562- func logger () telemetry.Logger {
567+ func logger (skipFrameCount int ) telemetry.Logger {
563568 hostname , _ := os .Hostname ()
564- fields := fiber. Map {
565- "pid" : os .Getpid (),
569+ fields := map [ string ] string {
570+ "pid" : strconv . Itoa ( os .Getpid () ),
566571 "hostname" : hostname ,
567572 }
568573
569- var writer io.Writer = zerolog.ConsoleWriter {Out : os .Stderr }
570- if ! isLocal () {
571- writer = os .Stderr
572- //gcpWriter, err := zlg.NewCloudLoggingWriter(
573- // context.Background(),
574- // os.Getenv("GCP_PROJECT_ID"),
575- // fmt.Sprintf("projects/%s/logs/run.googleapis.com%%2Fstderr", os.Getenv("GCP_PROJECT_ID")),
576- // zlg.CloudLoggingOptions{},
577- //)
578- //if err != nil {
579- // log.Fatal("could not create a CloudLoggingWriter")
580- //}
581- //writer = gcpWriter
574+ return telemetry .NewZerologLogger (
575+ os .Getenv ("GCP_PROJECT_ID" ),
576+ fields ,
577+ 3 ,
578+ logDriver (skipFrameCount ),
579+ nil ,
580+ )
581+ }
582+
583+ func logDriver (skipFrameCount int ) * zerodriver.Logger {
584+ if isLocal () {
585+ return consoleLogger (skipFrameCount )
586+ }
587+ return jsonLogger (skipFrameCount )
588+ }
589+
590+ func jsonLogger (skipFrameCount int ) * zerodriver.Logger {
591+ logLevel := zerolog .DebugLevel
592+ zerolog .SetGlobalLevel (logLevel )
593+
594+ // See: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
595+ logLevelSeverity := map [zerolog.Level ]string {
596+ zerolog .TraceLevel : "DEFAULT" ,
597+ zerolog .DebugLevel : "DEBUG" ,
598+ zerolog .InfoLevel : "INFO" ,
599+ zerolog .WarnLevel : "WARNING" ,
600+ zerolog .ErrorLevel : "ERROR" ,
601+ zerolog .PanicLevel : "CRITICAL" ,
602+ zerolog .FatalLevel : "CRITICAL" ,
603+ }
604+
605+ zerolog .LevelFieldName = "severity"
606+ zerolog .LevelFieldMarshalFunc = func (l zerolog.Level ) string {
607+ return logLevelSeverity [l ]
582608 }
609+ zerolog .TimestampFieldName = "time"
610+ zerolog .TimeFieldFormat = time .RFC3339Nano
611+
612+ zl := zerolog .New (os .Stderr ).With ().Timestamp ().CallerWithSkipFrameCount (skipFrameCount ).Logger ()
613+ return & zerodriver.Logger {Logger : & zl }
614+ }
583615
584- return telemetry .NewZerologLogger (zerolog .New (writer ).With ().Fields (fields ).Timestamp ().CallerWithSkipFrameCount (3 ))
616+ func consoleLogger (skipFrameCount int ) * zerodriver.Logger {
617+ l := zerolog .New (
618+ zerolog.ConsoleWriter {
619+ Out : os .Stderr ,
620+ }).With ().Timestamp ().CallerWithSkipFrameCount (skipFrameCount ).Logger ()
621+ return & zerodriver.Logger {
622+ Logger : & l ,
623+ }
585624}
586625
587626func isLocal () bool {
0 commit comments