From 65797e882afc08c3c0e3cffeddbd6323960197cb Mon Sep 17 00:00:00 2001 From: Eugene Dorfman Date: Tue, 9 Dec 2025 15:21:04 +0100 Subject: [PATCH] Logging: Add interface with default glog implementation (#4085) Co-authored-by: postindustria-code --- README.md | 8 + analytics/agma/agma_module.go | 14 +- analytics/agma/sender.go | 12 +- analytics/build/build.go | 9 +- analytics/filesystem/file_module.go | 4 +- analytics/pubstack/config.go | 4 +- .../pubstack/eventchannel/eventchannel.go | 8 +- analytics/pubstack/eventchannel/sender.go | 10 +- analytics/pubstack/pubstack_module.go | 21 +- config/bidderinfo.go | 4 +- config/config.go | 33 +- config/stored_requests.go | 6 +- config/structlog.go | 8 +- config/util/loggers.go | 2 +- currency/rate_converter.go | 8 +- endpoints/cookie_sync.go | 4 +- endpoints/currency_rates.go | 4 +- endpoints/events/vtrack.go | 4 +- endpoints/info/bidders.go | 12 +- endpoints/info/bidders_detail.go | 6 +- endpoints/openrtb2/amp_auction.go | 12 +- endpoints/openrtb2/auction.go | 12 +- endpoints/openrtb2/video_auction.go | 6 +- endpoints/version.go | 4 +- exchange/bidder.go | 6 +- exchange/bidder_test.go | 10 +- exchange/exchange.go | 6 +- experiment/adscert/SignerLogger.go | 15 +- floors/fetcher.go | 22 +- floors/rule.go | 4 +- gdpr/vendorlist-fetching.go | 12 +- hooks/hookexecution/context.go | 4 +- hooks/hookexecution/execution.go | 4 +- hooks/plan.go | 4 +- logger/glog.go | 41 +++ logger/glog_test.go | 171 ++++++++++ logger/interface.go | 18 ++ logger/logger.go | 28 ++ logger/logger_test.go | 304 ++++++++++++++++++ main.go | 13 +- metrics/go_metrics.go | 34 +- .../devicedetection/device_info_extractor.go | 8 +- modules/modules.go | 4 +- modules/scope3/rtd/module.go | 4 +- modules/shutdown.go | 4 +- pbs/usersync.go | 8 +- prebid_cache_client/client.go | 4 +- router/router.go | 36 +-- server/listener.go | 6 +- server/prometheus.go | 10 +- server/server.go | 26 +- .../backends/db_fetcher/fetcher.go | 17 +- .../backends/db_provider/db_provider.go | 8 +- .../backends/http_fetcher/fetcher.go | 9 +- stored_requests/caches/memory/cache.go | 8 +- stored_requests/caches/memory/maps.go | 6 +- stored_requests/config/config.go | 25 +- stored_requests/events/database/database.go | 18 +- stored_requests/events/http/http.go | 20 +- 59 files changed, 839 insertions(+), 293 deletions(-) create mode 100644 logger/glog.go create mode 100644 logger/glog_test.go create mode 100644 logger/interface.go create mode 100644 logger/logger.go create mode 100644 logger/logger_test.go diff --git a/README.md b/README.md index 01194000b..a00c2540c 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,14 @@ To maintain consistency in the project's code, please: - Do not discard errors. You should implement appropriate error handling, such as gracefully falling back to a default behavior or bubbling up an error. +## Swapping Global Dependencies + +Logger is a global side-effectful dependency that sometimes needs to be swapped to modify the behavior. +The `Logger` package contains an interface definition for unstructured logging with built-in `glog` implementation. +The interface provides standard logging methods: `Debug`, `Info`, `Warn`, `Error`, and `Fatal`. +The `glog` implementation is based on `github.com/golang/glog` package and serves as the concrete implementation for the logging interface. +By default, the package uses the `glog` logger implementation. + ## Contributing We welcome contributions to OpenAds Server in form of issues and PRs in this repository. If your change applies to both Prebid Server as well as OpenAds Server, please submit it to the [Prebid Server Go repository](https://github.com/prebid/prebid-server) as we will pull in relevant upstream changes. diff --git a/analytics/agma/agma_module.go b/analytics/agma/agma_module.go index 6ee16e93b..1e544fe60 100644 --- a/analytics/agma/agma_module.go +++ b/analytics/agma/agma_module.go @@ -12,10 +12,10 @@ import ( "github.com/benbjohnson/clock" "github.com/docker/go-units" - "github.com/golang/glog" "github.com/prebid/go-gdpr/vendorconsent" "github.com/prebid/prebid-server/v3/analytics" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/openrtb_ext" ) @@ -93,7 +93,7 @@ func (l *AgmaLogger) start() { for { select { case <-l.sigTermCh: - glog.Infof("[AgmaAnalytics] Received Close, trying to flush buffer") + logger.Infof("[AgmaAnalytics] Received Close, trying to flush buffer") l.flush() return case event := <-l.bufferCh: @@ -139,7 +139,7 @@ func (l *AgmaLogger) flush() { if err != nil { l.reset() l.mux.Unlock() - glog.Warning("[AgmaAnalytics] fail to copy the buffer") + logger.Warnf("[AgmaAnalytics] fail to copy the buffer") return } @@ -223,7 +223,7 @@ func (l *AgmaLogger) LogAuctionObject(event *analytics.AuctionObject) { } data, err := serializeAnayltics(event.RequestWrapper, EventTypeAuction, code, event.StartTime) if err != nil { - glog.Errorf("[AgmaAnalytics] Error serializing auction object: %v", err) + logger.Errorf("[AgmaAnalytics] Error serializing auction object: %v", err) return } l.bufferCh <- data @@ -239,7 +239,7 @@ func (l *AgmaLogger) LogAmpObject(event *analytics.AmpObject) { } data, err := serializeAnayltics(event.RequestWrapper, EventTypeAmp, code, event.StartTime) if err != nil { - glog.Errorf("[AgmaAnalytics] Error serializing amp object: %v", err) + logger.Errorf("[AgmaAnalytics] Error serializing amp object: %v", err) return } l.bufferCh <- data @@ -255,14 +255,14 @@ func (l *AgmaLogger) LogVideoObject(event *analytics.VideoObject) { } data, err := serializeAnayltics(event.RequestWrapper, EventTypeVideo, code, event.StartTime) if err != nil { - glog.Errorf("[AgmaAnalytics] Error serializing video object: %v", err) + logger.Errorf("[AgmaAnalytics] Error serializing video object: %v", err) return } l.bufferCh <- data } func (l *AgmaLogger) Shutdown() { - glog.Info("[AgmaAnalytics] Shutdown, trying to flush buffer") + logger.Infof("[AgmaAnalytics] Shutdown, trying to flush buffer") l.flush() // mutex safe } diff --git a/analytics/agma/sender.go b/analytics/agma/sender.go index 7ae2849a8..e3f9c7685 100644 --- a/analytics/agma/sender.go +++ b/analytics/agma/sender.go @@ -10,8 +10,8 @@ import ( "net/url" "time" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/version" ) @@ -51,7 +51,7 @@ func createHttpSender(httpClient *http.Client, endpoint config.AgmaAnalyticsHttp if endpoint.Gzip { requestBody, err = compressToGZIP(payload) if err != nil { - glog.Errorf("[agmaAnalytics] Compressing request failed %v", err) + logger.Errorf("[agmaAnalytics] Compressing request failed %v", err) return err } } else { @@ -60,7 +60,7 @@ func createHttpSender(httpClient *http.Client, endpoint config.AgmaAnalyticsHttp req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint.Url, bytes.NewBuffer(requestBody)) if err != nil { - glog.Errorf("[agmaAnalytics] Creating request failed %v", err) + logger.Errorf("[agmaAnalytics] Creating request failed %v", err) return err } @@ -72,18 +72,18 @@ func createHttpSender(httpClient *http.Client, endpoint config.AgmaAnalyticsHttp resp, err := httpClient.Do(req) if err != nil { - glog.Errorf("[agmaAnalytics] Sending request failed %v", err) + logger.Errorf("[agmaAnalytics] Sending request failed %v", err) return err } defer func() { if _, err := io.Copy(io.Discard, resp.Body); err != nil { - glog.Errorf("[agmaAnalytics] Draining response body failed: %v", err) + logger.Errorf("[agmaAnalytics] Draining response body failed: %v", err) } resp.Body.Close() }() if resp.StatusCode != http.StatusOK { - glog.Errorf("[agmaAnalytics] Wrong code received %d instead of %d", resp.StatusCode, http.StatusOK) + logger.Errorf("[agmaAnalytics] Wrong code received %d instead of %d", resp.StatusCode, http.StatusOK) return fmt.Errorf("wrong code received %d instead of %d", resp.StatusCode, http.StatusOK) } return nil diff --git a/analytics/build/build.go b/analytics/build/build.go index 9511e9975..c24c6c47a 100644 --- a/analytics/build/build.go +++ b/analytics/build/build.go @@ -4,7 +4,6 @@ import ( "encoding/json" "github.com/benbjohnson/clock" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/analytics" "github.com/prebid/prebid-server/v3/analytics/agma" "github.com/prebid/prebid-server/v3/analytics/auctionaudit" @@ -13,7 +12,7 @@ import ( "github.com/prebid/prebid-server/v3/analytics/pubstack" "github.com/prebid/prebid-server/v3/analytics/s3" "github.com/prebid/prebid-server/v3/config" - "github.com/prebid/prebid-server/v3/metrics" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/ortb" "github.com/prebid/prebid-server/v3/privacy" @@ -26,7 +25,7 @@ func New(analytics *config.Analytics, metricsEngine metrics.MetricsEngine) analy if mod, err := filesystem.NewFileLogger(analytics.File.Filename); err == nil { modules["filelogger"] = mod } else { - glog.Fatalf("Could not initialize FileLogger for file %v :%v", analytics.File.Filename, err) + logger.Fatalf("Could not initialize FileLogger for file %v :%v", analytics.File.Filename, err) } } @@ -43,7 +42,7 @@ func New(analytics *config.Analytics, metricsEngine metrics.MetricsEngine) analy if err == nil { modules["pubstack"] = pubstackModule } else { - glog.Errorf("Could not initialize PubstackModule: %v", err) + logger.Errorf("Could not initialize PubstackModule: %v", err) } } @@ -55,7 +54,7 @@ func New(analytics *config.Analytics, metricsEngine metrics.MetricsEngine) analy if err == nil { modules["agma"] = agmaModule } else { - glog.Errorf("Could not initialize Agma Anayltics: %v", err) + logger.Errorf("Could not initialize Agma Anayltics: %v", err) } } diff --git a/analytics/filesystem/file_module.go b/analytics/filesystem/file_module.go index 5555752e4..f2ab3c63d 100644 --- a/analytics/filesystem/file_module.go +++ b/analytics/filesystem/file_module.go @@ -5,9 +5,9 @@ import ( "fmt" cglog "github.com/chasex/glog" - "github.com/golang/glog" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v3/analytics" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/util/jsonutil" ) @@ -94,7 +94,7 @@ func (f *FileLogger) LogNotificationEventObject(ne *analytics.NotificationEvent) // Shutdown the logger func (f *FileLogger) Shutdown() { // clear all pending buffered data in case there is any - glog.Info("[FileLogger] Shutdown, trying to flush buffer") + logger.Infof("[FileLogger] Shutdown, trying to flush buffer") f.Logger.Flush() } diff --git a/analytics/pubstack/config.go b/analytics/pubstack/config.go index 28330fc36..38ca4cb13 100644 --- a/analytics/pubstack/config.go +++ b/analytics/pubstack/config.go @@ -9,7 +9,7 @@ import ( "time" "github.com/docker/go-units" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" ) func fetchConfig(client *http.Client, endpoint *url.URL) (*Configuration, error) { @@ -21,7 +21,7 @@ func fetchConfig(client *http.Client, endpoint *url.URL) (*Configuration, error) // read the entire response body to ensure full connection reuse if there's an // error while decoding the json if _, err := io.Copy(io.Discard, res.Body); err != nil { - glog.Errorf("[pubstack] Draining config response body failed: %v", err) + logger.Errorf("[pubstack] Draining config response body failed: %v", err) } res.Body.Close() }() diff --git a/analytics/pubstack/eventchannel/eventchannel.go b/analytics/pubstack/eventchannel/eventchannel.go index 022cc5bcf..bde37ee54 100644 --- a/analytics/pubstack/eventchannel/eventchannel.go +++ b/analytics/pubstack/eventchannel/eventchannel.go @@ -7,7 +7,7 @@ import ( "time" "github.com/benbjohnson/clock" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" ) type Metrics struct { @@ -66,7 +66,7 @@ func (c *EventChannel) buffer(event []byte) { _, err := c.gz.Write(event) if err != nil { - glog.Warning("[pubstack] fail to compress, skip the event") + logger.Warnf("[pubstack] fail to compress, skip the event") return } @@ -104,7 +104,7 @@ func (c *EventChannel) flush() { // finish writing gzip header err := c.gz.Close() if err != nil { - glog.Warning("[pubstack] fail to close gzipped buffer") + logger.Warnf("[pubstack] fail to close gzipped buffer") return } @@ -112,7 +112,7 @@ func (c *EventChannel) flush() { payload := make([]byte, c.buff.Len()) _, err = c.buff.Read(payload) if err != nil { - glog.Warning("[pubstack] fail to copy the buffer") + logger.Warnf("[pubstack] fail to copy the buffer") return } diff --git a/analytics/pubstack/eventchannel/sender.go b/analytics/pubstack/eventchannel/sender.go index c85c4fe44..61587ea94 100644 --- a/analytics/pubstack/eventchannel/sender.go +++ b/analytics/pubstack/eventchannel/sender.go @@ -8,7 +8,7 @@ import ( "net/url" "path" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" ) type Sender = func(payload []byte) error @@ -17,7 +17,7 @@ func NewHttpSender(client *http.Client, endpoint string) Sender { return func(payload []byte) error { req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewReader(payload)) if err != nil { - glog.Error(err) + logger.Errorf("%v", err) return err } @@ -30,13 +30,13 @@ func NewHttpSender(client *http.Client, endpoint string) Sender { } defer func() { if _, err := io.Copy(io.Discard, resp.Body); err != nil { - glog.Errorf("[pubstack] Draining sender response body failed: %v", err) + logger.Errorf("[pubstack] Draining sender response body failed: %v", err) } resp.Body.Close() }() if resp.StatusCode != http.StatusOK { - glog.Errorf("[pubstack] Wrong code received %d instead of %d", resp.StatusCode, http.StatusOK) + logger.Errorf("[pubstack] Wrong code received %d instead of %d", resp.StatusCode, http.StatusOK) return fmt.Errorf("wrong code received %d instead of %d", resp.StatusCode, http.StatusOK) } return nil @@ -46,7 +46,7 @@ func NewHttpSender(client *http.Client, endpoint string) Sender { func BuildEndpointSender(client *http.Client, baseUrl string, module string) Sender { endpoint, err := url.Parse(baseUrl) if err != nil { - glog.Error(err) + logger.Errorf("%v", err) } endpoint.Path = path.Join(endpoint.Path, "intake", module) return NewHttpSender(client, endpoint.String()) diff --git a/analytics/pubstack/pubstack_module.go b/analytics/pubstack/pubstack_module.go index c5bb02e2e..9a8116951 100644 --- a/analytics/pubstack/pubstack_module.go +++ b/analytics/pubstack/pubstack_module.go @@ -10,11 +10,10 @@ import ( "time" "github.com/benbjohnson/clock" - "github.com/golang/glog" - "github.com/prebid/prebid-server/v3/analytics" "github.com/prebid/prebid-server/v3/analytics/pubstack/eventchannel" "github.com/prebid/prebid-server/v3/analytics/pubstack/helpers" + "github.com/prebid/prebid-server/v3/logger" ) type Configuration struct { @@ -64,7 +63,7 @@ func NewModule(client *http.Client, scope, endpoint, configRefreshDelay string, } func NewModuleWithConfigTask(client *http.Client, scope, endpoint string, maxEventCount int, maxByteSize, maxTime string, configTask ConfigUpdateTask, clock clock.Clock) (analytics.Module, error) { - glog.Infof("[pubstack] Initializing module scope=%s endpoint=%s\n", scope, endpoint) + logger.Infof("[pubstack] Initializing module scope=%s endpoint=%s\n", scope, endpoint) // parse args bufferCfg, err := newBufferConfig(maxEventCount, maxByteSize, maxTime) @@ -103,7 +102,7 @@ func NewModuleWithConfigTask(client *http.Client, scope, endpoint string, maxEve configChannel := configTask.Start(pb.stopCh) go pb.start(configChannel) - glog.Info("[pubstack] Pubstack analytics configured and ready") + logger.Infof("[pubstack] Pubstack analytics configured and ready") return &pb, nil } @@ -118,7 +117,7 @@ func (p *PubstackModule) LogAuctionObject(ao *analytics.AuctionObject) { // serialize event payload, err := helpers.JsonifyAuctionObject(ao, p.scope) if err != nil { - glog.Warning("[pubstack] Cannot serialize auction") + logger.Warnf("[pubstack] Cannot serialize auction") return } @@ -139,7 +138,7 @@ func (p *PubstackModule) LogVideoObject(vo *analytics.VideoObject) { // serialize event payload, err := helpers.JsonifyVideoObject(vo, p.scope) if err != nil { - glog.Warning("[pubstack] Cannot serialize video") + logger.Warnf("[pubstack] Cannot serialize video") return } @@ -157,7 +156,7 @@ func (p *PubstackModule) LogSetUIDObject(so *analytics.SetUIDObject) { // serialize event payload, err := helpers.JsonifySetUIDObject(so, p.scope) if err != nil { - glog.Warning("[pubstack] Cannot serialize video") + logger.Warnf("[pubstack] Cannot serialize video") return } @@ -175,7 +174,7 @@ func (p *PubstackModule) LogCookieSyncObject(cso *analytics.CookieSyncObject) { // serialize event payload, err := helpers.JsonifyCookieSync(cso, p.scope) if err != nil { - glog.Warning("[pubstack] Cannot serialize video") + logger.Warnf("[pubstack] Cannot serialize video") return } @@ -193,7 +192,7 @@ func (p *PubstackModule) LogAmpObject(ao *analytics.AmpObject) { // serialize event payload, err := helpers.JsonifyAmpObject(ao, p.scope) if err != nil { - glog.Warning("[pubstack] Cannot serialize video") + logger.Warnf("[pubstack] Cannot serialize video") return } @@ -203,7 +202,7 @@ func (p *PubstackModule) LogAmpObject(ao *analytics.AmpObject) { // Shutdown - no op since the analytic module already implements system signal handling // and trying to close a closed channel will cause panic func (p *PubstackModule) Shutdown() { - glog.Info("[PubstackModule] Shutdown") + logger.Infof("[PubstackModule] Shutdown") } func (p *PubstackModule) start(c <-chan *Configuration) { @@ -216,7 +215,7 @@ func (p *PubstackModule) start(c <-chan *Configuration) { return case config := <-c: p.updateConfig(config) - glog.Infof("[pubstack] Updating config: %v", p.cfg) + logger.Infof("[pubstack] Updating config: %v", p.cfg) } } } diff --git a/config/bidderinfo.go b/config/bidderinfo.go index e3a2514dc..ce3eb57e0 100644 --- a/config/bidderinfo.go +++ b/config/bidderinfo.go @@ -3,12 +3,12 @@ package config import ( "errors" "fmt" - "log" "os" "path/filepath" "strings" "text/template" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/macros" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/util/ptrutil" @@ -285,7 +285,7 @@ const ( func (r InfoReaderFromDisk) Read() (map[string][]byte, error) { bidderConfigs, err := os.ReadDir(r.Path) if err != nil { - log.Fatal(err) + logger.Fatalf("%v", err) } bidderInfos := make(map[string][]byte) diff --git a/config/config.go b/config/config.go index 4cefc60fc..02153c247 100644 --- a/config/config.go +++ b/config/config.go @@ -9,10 +9,10 @@ import ( "strings" "time" - "github.com/golang/glog" "github.com/prebid/go-gdpr/consentconstants" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v3/errortypes" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/util/jsonutil" "github.com/spf13/viper" @@ -177,11 +177,11 @@ func (cfg *Configuration) validate(v *viper.Viper) []error { errs = cfg.ExtCacheURL.validate(errs) errs = cfg.AccountDefaults.PriceFloors.validate(errs) if cfg.AccountDefaults.Disabled { - glog.Warning(`With account_defaults.disabled=true, host-defined accounts must exist and have "disabled":false. All other requests will be rejected.`) + logger.Warnf(`With account_defaults.disabled=true, host-defined accounts must exist and have "disabled":false. All other requests will be rejected.`) } if cfg.AccountDefaults.Events.Enabled { - glog.Warning(`account_defaults.events has no effect as the feature is under development.`) + logger.Warnf(`account_defaults.events has no effect as the feature is under development.`) } errs = cfg.Experiment.validate(errs) @@ -293,7 +293,7 @@ func (cfg *GDPR) validate(v *viper.Viper, errs []error) []error { errs = append(errs, fmt.Errorf("gdpr.host_vendor_id must be in the range [0, %d]. Got %d", 0xffff, cfg.HostVendorID)) } if cfg.HostVendorID == 0 { - glog.Warning("gdpr.host_vendor_id was not specified. Host company GDPR checks will be skipped.") + logger.Warnf("gdpr.host_vendor_id was not specified. Host company GDPR checks will be skipped.") } if cfg.AMPException { errs = append(errs, fmt.Errorf("gdpr.amp_exception has been discontinued and must be removed from your config. If you need to disable GDPR for AMP, you may do so per-account (gdpr.integration_enabled.amp) or at the host level for the default account (account_defaults.gdpr.integration_enabled.amp)")) @@ -802,7 +802,8 @@ func New(v *viper.Viper, bidderInfos BidderInfos, normalizeBidderName openrtb_ex } if err := isValidCookieSize(c.HostCookie.MaxCookieSizeBytes); err != nil { - glog.Fatal(fmt.Printf("Max cookie size %d cannot be less than %d \n", c.HostCookie.MaxCookieSizeBytes, MIN_COOKIE_SIZE_BYTES)) + logger.Fatalf("Max cookie size %d cannot be less than %d \n", c.HostCookie.MaxCookieSizeBytes, MIN_COOKIE_SIZE_BYTES) + return nil, err } @@ -892,25 +893,7 @@ func New(v *viper.Viper, bidderInfos BidderInfos, normalizeBidderName openrtb_ex } c.BidderInfos = mergedBidderInfos - if c.BidderAllowList != nil && len(c.BidderAllowList) > 0 { - glog.Info("Filtering configured bidders based on allowlist.") - allowed := BidderInfos{} - for _, value := range c.BidderAllowList { - info, ok := c.BidderInfos[value] - if ok { - allowed[value] = info - } else { - glog.Warning("Bidder '" + value + "' not configured.") - } - } - c.BidderInfos = allowed - } - - for bidderName := range c.BidderInfos { - setBidderDefaults(v, strings.ToLower(bidderName)) - } - - glog.Info("Logging the resolved configuration:") + logger.Infof("Logging the resolved configuration:") logGeneral(reflect.ValueOf(c), " \t") if errs := c.validate(v); len(errs) > 0 { return &c, errortypes.NewAggregateError("validation errors", errs) @@ -953,7 +936,7 @@ func setConfigBidderInfoNillableFields(v *viper.Viper, bidderInfos BidderInfos) func (cfg *Configuration) MarshalAccountDefaults() error { var err error if cfg.accountDefaultsJSON, err = jsonutil.Marshal(cfg.AccountDefaults); err != nil { - glog.Warningf("converting %+v to json: %v", cfg.AccountDefaults, err) + logger.Warnf("converting %+v to json: %v", cfg.AccountDefaults, err) } return err } diff --git a/config/stored_requests.go b/config/stored_requests.go index 2e8d1e7f8..73acc1bf0 100644 --- a/config/stored_requests.go +++ b/config/stored_requests.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" ) // DataType constants @@ -358,7 +358,7 @@ func (cfg *InMemoryCache) validate(dataType DataType, errs []error) []error { errs = append(errs, fmt.Errorf("%s: in_memory_cache.size_bytes must be >= 0 when in_memory_cache.type=lru. Got %d", section, cfg.Size)) } if cfg.RequestCacheSize > 0 || cfg.ImpCacheSize > 0 || cfg.RespCacheSize > 0 { - glog.Warningf("%s: in_memory_cache.request_cache_size_bytes, imp_cache_size_bytes and resp_cache_size_bytes do not apply to this section and will be ignored", section) + logger.Warnf("%s: in_memory_cache.request_cache_size_bytes, imp_cache_size_bytes and resp_cache_size_bytes do not apply to this section and will be ignored", section) } } else { // dual (request and imp) caches @@ -372,7 +372,7 @@ func (cfg *InMemoryCache) validate(dataType DataType, errs []error) []error { errs = append(errs, fmt.Errorf("%s: in_memory_cache.resp_cache_size_bytes must be >= 0 when in_memory_cache.type=lru. Got %d", section, cfg.RespCacheSize)) } if cfg.Size > 0 { - glog.Warningf("%s: in_memory_cache.size_bytes does not apply in this section and will be ignored", section) + logger.Warnf("%s: in_memory_cache.size_bytes does not apply in this section and will be ignored", section) } } default: diff --git a/config/structlog.go b/config/structlog.go index 911f47571..6faec25cc 100644 --- a/config/structlog.go +++ b/config/structlog.go @@ -6,7 +6,7 @@ import ( "regexp" "strings" - "github.com/golang/glog" + logInternal "github.com/prebid/prebid-server/v3/logger" ) type logMsg func(string, ...interface{}) @@ -20,7 +20,7 @@ var blocklistregexp = []*regexp.Regexp{ // prefix if you want that name to be logged. Structs will append . recursively to the prefix // to document deeper structure. func logGeneral(v reflect.Value, prefix string) { - logGeneralWithLogger(v, prefix, glog.Infof) + logGeneralWithLogger(v, prefix, logInternal.Infof) } func logGeneralWithLogger(v reflect.Value, prefix string, logger logMsg) { @@ -45,7 +45,7 @@ func logGeneralWithLogger(v reflect.Value, prefix string, logger logMsg) { func logStructWithLogger(v reflect.Value, prefix string, logger logMsg) { if v.Kind() != reflect.Struct { - glog.Fatalf("LogStruct called on type %s, whuch is not a struct!", v.Type().String()) + logInternal.Fatalf("LogStruct called on type %s, whuch is not a struct!", v.Type().String()) } t := v.Type() for i := 0; i < t.NumField(); i++ { @@ -60,7 +60,7 @@ func logStructWithLogger(v reflect.Value, prefix string, logger logMsg) { func logMapWithLogger(v reflect.Value, prefix string, logger logMsg) { if v.Kind() != reflect.Map { - glog.Fatalf("LogMap called on type %s, whuch is not a map!", v.Type().String()) + logInternal.Fatalf("LogMap called on type %s, whuch is not a map!", v.Type().String()) } for _, k := range v.MapKeys() { if k.Kind() == reflect.String && !allowedName(k.String()) { diff --git a/config/util/loggers.go b/config/util/loggers.go index d9aad43a7..0731376e1 100644 --- a/config/util/loggers.go +++ b/config/util/loggers.go @@ -4,7 +4,7 @@ import ( "math/rand" ) -type LogMsg func(string, ...interface{}) +type LogMsg func(string, ...any) type randomGenerator func() float32 diff --git a/currency/rate_converter.go b/currency/rate_converter.go index d1898a59a..c791c9b66 100644 --- a/currency/rate_converter.go +++ b/currency/rate_converter.go @@ -8,8 +8,8 @@ import ( "sync/atomic" "time" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/errortypes" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/util/jsonutil" "github.com/prebid/prebid-server/v3/util/timeutil" ) @@ -63,7 +63,7 @@ func (rc *RateConverter) fetch() (*Rates, error) { // read the entire response body to ensure full connection reuse if there's an // invalid status code if _, err := io.Copy(io.Discard, response.Body); err != nil { - glog.Errorf("error draining conversion rates response body: %v", err) + logger.Errorf("error draining conversion rates response body: %v", err) } response.Body.Close() }() @@ -96,9 +96,9 @@ func (rc *RateConverter) update() error { } else { if rc.checkStaleRates() { rc.clearRates() - glog.Errorf("Error updating conversion rates, falling back to constant rates: %v", err) + logger.Errorf("Error updating conversion rates, falling back to constant rates: %v", err) } else { - glog.Errorf("Error updating conversion rates: %v", err) + logger.Errorf("Error updating conversion rates: %v", err) } } diff --git a/endpoints/cookie_sync.go b/endpoints/cookie_sync.go index 6a836ed97..a90bc6117 100644 --- a/endpoints/cookie_sync.go +++ b/endpoints/cookie_sync.go @@ -12,7 +12,6 @@ import ( "strings" "time" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" gpplib "github.com/prebid/go-gpp" gppConstants "github.com/prebid/go-gpp/constants" @@ -21,6 +20,7 @@ import ( "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/errortypes" "github.com/prebid/prebid-server/v3/gdpr" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/macros" "github.com/prebid/prebid-server/v3/metrics" "github.com/prebid/prebid-server/v3/openrtb_ext" @@ -458,7 +458,7 @@ func (c *cookieSyncEndpoint) handleResponse(w http.ResponseWriter, tf usersync.S syncTypes := tf.ForBidder(syncerChoice.Bidder) sync, err := syncerChoice.Syncer.GetSync(syncTypes, m) if err != nil { - glog.Errorf("Failed to get usersync info for %s: %v", syncerChoice.Bidder, err) + logger.Errorf("Failed to get usersync info for %s: %v", syncerChoice.Bidder, err) continue } diff --git a/endpoints/currency_rates.go b/endpoints/currency_rates.go index 9d27fb249..f7d20cd79 100644 --- a/endpoints/currency_rates.go +++ b/endpoints/currency_rates.go @@ -4,8 +4,8 @@ import ( "net/http" "time" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/currency" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/util/jsonutil" ) @@ -62,7 +62,7 @@ func NewCurrencyRatesEndpoint(rateConverter rateConverter, fetchingInterval time return func(w http.ResponseWriter, _ *http.Request) { jsonOutput, err := jsonutil.Marshal(currencyRateInfo) if err != nil { - glog.Errorf("/currency/rates Critical error when trying to marshal currencyRateInfo: %v", err) + logger.Errorf("/currency/rates Critical error when trying to marshal currencyRateInfo: %v", err) w.WriteHeader(http.StatusInternalServerError) return } diff --git a/endpoints/events/vtrack.go b/endpoints/events/vtrack.go index 590243bb5..ff846f694 100644 --- a/endpoints/events/vtrack.go +++ b/endpoints/events/vtrack.go @@ -9,12 +9,12 @@ import ( "strings" "time" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" accountService "github.com/prebid/prebid-server/v3/account" "github.com/prebid/prebid-server/v3/analytics" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/errortypes" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/prebid_cache_client" @@ -213,7 +213,7 @@ func (v *vtrackEndpoint) handleVTrackRequest(ctx context.Context, req *BidCacheR // handle pbs caching errors if len(errs) != 0 { - glog.Errorf("Error(s) updating vast: %v", errs) + logger.Errorf("Error(s) updating vast: %v", errs) return nil, errs } diff --git a/endpoints/info/bidders.go b/endpoints/info/bidders.go index 5de9c05a2..d5f6ea330 100644 --- a/endpoints/info/bidders.go +++ b/endpoints/info/bidders.go @@ -5,9 +5,9 @@ import ( "sort" "strings" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/util/jsonutil" ) @@ -18,22 +18,22 @@ var invalidBaseAdaptersOnlyMsg = []byte(`Invalid value for 'baseadaptersonly' qu func NewBiddersEndpoint(bidders config.BidderInfos) httprouter.Handle { responseAll, err := prepareBiddersResponseAll(bidders) if err != nil { - glog.Fatalf("error creating /info/bidders endpoint all bidders response: %v", err) + logger.Fatalf("error creating /info/bidders endpoint all bidders response: %v", err) } responseAllBaseOnly, err := prepareBiddersResponseAllBaseOnly(bidders) if err != nil { - glog.Fatalf("error creating /info/bidders endpoint all bidders (base adapters only) response: %v", err) + logger.Fatalf("error creating /info/bidders endpoint all bidders (base adapters only) response: %v", err) } responseEnabledOnly, err := prepareBiddersResponseEnabledOnly(bidders) if err != nil { - glog.Fatalf("error creating /info/bidders endpoint enabled only response: %v", err) + logger.Fatalf("error creating /info/bidders endpoint enabled only response: %v", err) } responseEnabledOnlyBaseOnly, err := prepareBiddersResponseEnabledOnlyBaseOnly(bidders) if err != nil { - glog.Fatalf("error creating /info/bidders endpoint enabled only (base adapters only) response: %v", err) + logger.Fatalf("error creating /info/bidders endpoint enabled only (base adapters only) response: %v", err) } return func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { @@ -137,6 +137,6 @@ func writeResponse(w http.ResponseWriter, data []byte) { func writeWithErrorHandling(w http.ResponseWriter, data []byte) { if _, err := w.Write(data); err != nil { - glog.Errorf("error writing response to /info/bidders: %v", err) + logger.Errorf("error writing response to /info/bidders: %v", err) } } diff --git a/endpoints/info/bidders_detail.go b/endpoints/info/bidders_detail.go index 098dad032..1a0936a07 100644 --- a/endpoints/info/bidders_detail.go +++ b/endpoints/info/bidders_detail.go @@ -6,9 +6,9 @@ import ( "net/http" "strings" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/util/jsonutil" ) @@ -22,7 +22,7 @@ const ( func NewBiddersDetailEndpoint(bidders config.BidderInfos) httprouter.Handle { responses, err := prepareBiddersDetailResponse(bidders) if err != nil { - glog.Fatalf("error creating /info/bidders/ endpoint response: %v", err) + logger.Fatalf("error creating /info/bidders/ endpoint response: %v", err) } return func(w http.ResponseWriter, _ *http.Request, ps httprouter.Params) { @@ -36,7 +36,7 @@ func NewBiddersDetailEndpoint(bidders config.BidderInfos) httprouter.Handle { if response, ok := responses[bidderName]; ok { w.Header().Set("Content-Type", "application/json") if _, err := w.Write(response); err != nil { - glog.Errorf("error writing response to /info/bidders/%s: %v", bidder, err) + logger.Errorf("error writing response to /info/bidders/%s: %v", bidder, err) } } else { w.WriteHeader(http.StatusNotFound) diff --git a/endpoints/openrtb2/amp_auction.go b/endpoints/openrtb2/amp_auction.go index 25003ae08..bc8b16fdc 100644 --- a/endpoints/openrtb2/amp_auction.go +++ b/endpoints/openrtb2/amp_auction.go @@ -12,7 +12,6 @@ import ( "time" "github.com/buger/jsonparser" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/openrtb/v20/openrtb3" @@ -28,6 +27,7 @@ import ( "github.com/prebid/prebid-server/v3/errortypes" "github.com/prebid/prebid-server/v3/exchange" "github.com/prebid/prebid-server/v3/hooks" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/privacy" @@ -293,7 +293,7 @@ func (deps *endpointDeps) AmpAuction(w http.ResponseWriter, r *http.Request, _ h if err != nil && !isRejectErr { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Critical error while running the auction: %v", err) - glog.Errorf("/openrtb2/amp Critical error: %v", err) + logger.Errorf("/openrtb2/amp Critical error: %v", err) ao.Status = http.StatusInternalServerError ao.Errors = append(ao.Errors, err) return @@ -304,7 +304,7 @@ func (deps *endpointDeps) AmpAuction(w http.ResponseWriter, r *http.Request, _ h if err := reqWrapper.RebuildRequest(); err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Critical error while running the auction: %v", err) - glog.Errorf("/openrtb2/amp Critical error: %v", err) + logger.Errorf("/openrtb2/amp Critical error: %v", err) ao.Status = http.StatusInternalServerError ao.Errors = append(ao.Errors, err) return @@ -368,7 +368,7 @@ func sendAmpResponse( if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Critical error while unpacking AMP targets: %v", err) - glog.Errorf("/openrtb2/amp Critical error unpacking targets: %v", err) + logger.Errorf("/openrtb2/amp Critical error unpacking targets: %v", err) ao.Errors = append(ao.Errors, fmt.Errorf("Critical error while unpacking AMP targets: %v", err)) ao.Status = http.StatusInternalServerError return labels, ao @@ -471,7 +471,7 @@ func getExtBidResponse( if extResponse.Debug != nil { extBidResponse.Debug = extResponse.Debug } else { - glog.Errorf("Test set on request but debug not present in response.") + logger.Errorf("Test set on request but debug not present in response.") ao.Errors = append(ao.Errors, fmt.Errorf("test set on request but debug not present in response")) } } @@ -481,7 +481,7 @@ func getExtBidResponse( modules, warns, err := hookexecution.GetModulesJSON(stageOutcomes, reqWrapper.BidRequest, account) if err != nil { err := fmt.Errorf("Failed to get modules outcome: %s", err) - glog.Errorf(err.Error()) + logger.Errorf("%v", err.Error()) ao.Errors = append(ao.Errors, err) } else if modules != nil { extBidResponse.Prebid = &openrtb_ext.ExtResponsePrebid{Modules: modules} diff --git a/endpoints/openrtb2/auction.go b/endpoints/openrtb2/auction.go index f03e6bc48..0eaf0e302 100644 --- a/endpoints/openrtb2/auction.go +++ b/endpoints/openrtb2/auction.go @@ -16,7 +16,6 @@ import ( "github.com/buger/jsonparser" "github.com/gofrs/uuid" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" gpplib "github.com/prebid/go-gpp" "github.com/prebid/go-gpp/constants" @@ -24,6 +23,7 @@ import ( "github.com/prebid/openrtb/v20/openrtb3" "github.com/prebid/prebid-server/v3/bidadjustment" "github.com/prebid/prebid-server/v3/hooks" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/ortb" "github.com/prebid/prebid-server/v3/privacy" "github.com/prebid/prebid-server/v3/privacysandbox" @@ -287,7 +287,7 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http labels.RequestStatus = metrics.RequestStatusErr w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Critical error while running the auction: %v", err) - glog.Errorf("/openrtb2/auction Critical error: %v", err) + logger.Errorf("/openrtb2/auction Critical error: %v", err) ao.Status = http.StatusInternalServerError ao.Errors = append(ao.Errors, err) return @@ -298,7 +298,7 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http err = setSeatNonBidRaw(req, auctionResponse) if err != nil { - glog.Errorf("Error setting seat non-bid: %v", err) + logger.Errorf("Error setting seat non-bid: %v", err) } labels, ao = sendAuctionResponse(w, hookExecutor, response, req.BidRequest, account, labels, ao) } @@ -368,7 +368,7 @@ func sendAuctionResponse( ext, warns, err := hookexecution.EnrichExtBidResponse(response.Ext, stageOutcomes, request, account) if err != nil { err = fmt.Errorf("Failed to enrich Bid Response with hook debug information: %s", err) - glog.Errorf(err.Error()) + logger.Errorf("%v", err) ao.Errors = append(ao.Errors, err) } else { response.Ext = ext @@ -466,7 +466,7 @@ func (deps *endpointDeps) parseRequest(httpRequest *http.Request, labels *metric if rejectErr != nil { errs = []error{rejectErr} if err = jsonutil.UnmarshalValid(requestJson, req.BidRequest); err != nil { - glog.Errorf("Failed to unmarshal BidRequest during entrypoint rejection: %s", err) + logger.Errorf("Failed to unmarshal BidRequest during entrypoint rejection: %s", err) } return } @@ -514,7 +514,7 @@ func (deps *endpointDeps) parseRequest(httpRequest *http.Request, labels *metric if rejectErr != nil { errs = []error{rejectErr} if err = jsonutil.UnmarshalValid(requestJson, req.BidRequest); err != nil { - glog.Errorf("Failed to unmarshal BidRequest during raw auction stage rejection: %s", err) + logger.Errorf("Failed to unmarshal BidRequest during raw auction stage rejection: %s", err) } return } diff --git a/endpoints/openrtb2/video_auction.go b/endpoints/openrtb2/video_auction.go index e82981c3d..047511f37 100644 --- a/endpoints/openrtb2/video_auction.go +++ b/endpoints/openrtb2/video_auction.go @@ -14,11 +14,11 @@ import ( "github.com/buger/jsonparser" "github.com/gofrs/uuid" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v3/hooks" "github.com/prebid/prebid-server/v3/hooks/hookexecution" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/ortb" "github.com/prebid/prebid-server/v3/privacy" jsonpatch "gopkg.in/evanphx/json-patch.v5" @@ -371,7 +371,7 @@ func (deps *endpointDeps) VideoAuctionEndpoint(w http.ResponseWriter, r *http.Re if bidReq.Test == 1 { err = setSeatNonBidRaw(bidReqWrapper, auctionResponse) if err != nil { - glog.Errorf("Error setting seat non-bid: %v", err) + logger.Errorf("Error setting seat non-bid: %v", err) } bidResp.Ext = response.Ext } @@ -441,7 +441,7 @@ func handleError(labels *metrics.Labels, w http.ResponseWriter, errL []error, vo w.WriteHeader(status) vo.Status = status fmt.Fprintf(w, "Critical error while running the video endpoint: %v", errors) - glog.Errorf("/openrtb2/video Critical error: %v", errors) + logger.Errorf("/openrtb2/video Critical error: %v", errors) vo.Errors = append(vo.Errors, errL...) } diff --git a/endpoints/version.go b/endpoints/version.go index 8eb305c3f..b947c771f 100644 --- a/endpoints/version.go +++ b/endpoints/version.go @@ -4,7 +4,7 @@ import ( "encoding/json" "net/http" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/util/jsonutil" ) @@ -14,7 +14,7 @@ const versionEndpointValueNotSet = "not-set" func NewVersionEndpoint(version, revision string) http.HandlerFunc { response, err := prepareVersionEndpointResponse(version, revision) if err != nil { - glog.Fatalf("error creating /version endpoint response: %v", err) + logger.Fatalf("error creating /version endpoint response: %v", err) } return func(w http.ResponseWriter, _ *http.Request) { diff --git a/exchange/bidder.go b/exchange/bidder.go index c0c748b9b..ef8d943da 100644 --- a/exchange/bidder.go +++ b/exchange/bidder.go @@ -19,13 +19,13 @@ import ( "sync/atomic" "time" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/bidadjustment" "github.com/prebid/prebid-server/v3/config/util" "github.com/prebid/prebid-server/v3/currency" "github.com/prebid/prebid-server/v3/exchange/entities" "github.com/prebid/prebid-server/v3/experiment/adscert" "github.com/prebid/prebid-server/v3/hooks/hookexecution" + loggerI "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/version" "github.com/prebid/openrtb/v20/adcom1" @@ -568,7 +568,7 @@ func makeExt(httpInfo *httpCallInfo) *openrtb_ext.ExtHttpCall { // Bidder interface. func (bidder *BidderAdapter) doRequest(ctx context.Context, req *adapters.RequestData, bidderRequestStartTime time.Time, tmaxAdjustments *TmaxAdjustmentsPreprocessed) *httpCallInfo { if bidder.shouldRequest() { - return bidder.doRequestImpl(ctx, req, glog.Warningf, bidderRequestStartTime, tmaxAdjustments) + return bidder.doRequestImpl(ctx, req, loggerI.Warnf, bidderRequestStartTime, tmaxAdjustments) } return &httpCallInfo{ request: req, @@ -681,7 +681,7 @@ func (bidder *BidderAdapter) doTimeoutNotification(timeoutBidder adapters.Timeou if err == nil { defer func() { if _, err := io.Copy(io.Discard, httpResp.Body); err != nil { - glog.Errorf("TimeoutNotification: Draining response body failed %v", err) + loggerI.Errorf("TimeoutNotification: Draining response body failed %v", err) } httpResp.Body.Close() }() diff --git a/exchange/bidder_test.go b/exchange/bidder_test.go index e8e0b5a8b..d8aaddd96 100644 --- a/exchange/bidder_test.go +++ b/exchange/bidder_test.go @@ -21,7 +21,6 @@ import ( "testing" "time" - "github.com/golang/glog" "github.com/prebid/openrtb/v20/adcom1" nativeRequests "github.com/prebid/openrtb/v20/native1/request" nativeResponse "github.com/prebid/openrtb/v20/native1/response" @@ -33,6 +32,7 @@ import ( "github.com/prebid/prebid-server/v3/exchange/entities" "github.com/prebid/prebid-server/v3/experiment/adscert" "github.com/prebid/prebid-server/v3/hooks/hookexecution" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" metricsConfig "github.com/prebid/prebid-server/v3/metrics/config" "github.com/prebid/prebid-server/v3/openrtb_ext" @@ -2214,7 +2214,7 @@ func TestTimeoutNotificationOff(t *testing.T) { if tb, ok := bidder.Bidder.(adapters.TimeoutBidder); !ok { t.Error("Failed to cast bidder to a TimeoutBidder") } else { - bidder.doTimeoutNotification(tb, &adapters.RequestData{}, glog.Warningf) + bidder.doTimeoutNotification(tb, &adapters.RequestData{}, logger.Warnf) } } @@ -2269,7 +2269,7 @@ func TestTimeoutNotificationOn(t *testing.T) { } var loggerBuffer bytes.Buffer - logger := func(msg string, args ...interface{}) { + logger := func(msg string, args ...any) { loggerBuffer.WriteString(fmt.Sprintf(fmt.Sprintln(msg), args...)) } tmaxAdjustments := &TmaxAdjustmentsPreprocessed{} @@ -3390,7 +3390,7 @@ func TestDoRequestImplWithTmax(t *testing.T) { me: &metricsConfig.NilMetricsEngine{}, Client: server.Client(), } - logger := func(msg string, args ...interface{}) {} + logger := func(msg string, args ...any) {} tests := []struct { ctxDeadline time.Time @@ -3465,7 +3465,7 @@ func TestDoRequestImplWithTmaxTimeout(t *testing.T) { me: metricsMock, Client: server.Client(), } - logger := func(msg string, args ...interface{}) {} + logger := func(msg string, args ...any) {} tests := []struct { ctxDeadline time.Time diff --git a/exchange/exchange.go b/exchange/exchange.go index 1915e7b27..ef24e3fc9 100644 --- a/exchange/exchange.go +++ b/exchange/exchange.go @@ -27,6 +27,7 @@ import ( "github.com/prebid/prebid-server/v3/floors" "github.com/prebid/prebid-server/v3/gdpr" "github.com/prebid/prebid-server/v3/hooks/hookexecution" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/macros" "github.com/prebid/prebid-server/v3/metrics" "github.com/prebid/prebid-server/v3/openrtb_ext" @@ -41,7 +42,6 @@ import ( "github.com/buger/jsonparser" "github.com/gofrs/uuid" - "github.com/golang/glog" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/openrtb/v20/openrtb3" ) @@ -743,7 +743,7 @@ func (e *exchange) getAllBids( bidderRunner := e.recoverSafely(bidderRequests, func(bidderRequest BidderRequest, conversions currency.Conversions) { // Passing in aName so a doesn't change out from under the go routine if bidderRequest.BidderLabels.Adapter == "" { - glog.Errorf("Exchange: bidlables for %s (%s) missing adapter string", bidderRequest.BidderName, bidderRequest.BidderCoreName) + logger.Errorf("Exchange: bidlables for %s (%s) missing adapter string", bidderRequest.BidderName, bidderRequest.BidderCoreName) bidderRequest.BidderLabels.Adapter = bidderRequest.BidderCoreName } brw := new(bidResponseWrapper) @@ -878,7 +878,7 @@ func (e *exchange) recoverSafely(bidderRequests []BidderRequest, allBidders = sb.String()[:sb.Len()-1] } - glog.Errorf("OpenRTB auction recovered panic from Bidder %s: %v. "+ + logger.Errorf("OpenRTB auction recovered panic from Bidder %s: %v. "+ "Account id: %s, All Bidders: %s, Stack trace is: %v", bidderRequest.BidderCoreName, r, bidderRequest.BidderLabels.PubID, allBidders, string(debug.Stack())) e.me.RecordAdapterPanic(bidderRequest.BidderLabels) diff --git a/experiment/adscert/SignerLogger.go b/experiment/adscert/SignerLogger.go index 1d99bcc63..798e9bd2a 100644 --- a/experiment/adscert/SignerLogger.go +++ b/experiment/adscert/SignerLogger.go @@ -2,7 +2,8 @@ package adscert import ( "fmt" - "github.com/golang/glog" + + "github.com/prebid/prebid-server/v3/logger" ) type SignerLogger struct { @@ -10,27 +11,27 @@ type SignerLogger struct { func (sl *SignerLogger) Debugf(format string, args ...interface{}) { //there is no Debug level in glog - glog.Infof(format, args...) + logger.Infof(format, args...) } func (sl *SignerLogger) Infof(format string, args ...interface{}) { - glog.Infof(format, args...) + logger.Infof(format, args...) } func (sl *SignerLogger) Info(format string) { - glog.Info(format) + logger.Infof(format) } func (sl *SignerLogger) Warningf(format string, args ...interface{}) { - glog.Warningf(format, args...) + logger.Warnf(format, args...) } func (sl *SignerLogger) Errorf(format string, args ...interface{}) { - glog.Errorf(format, args...) + logger.Errorf(format, args...) } func (sl *SignerLogger) Fatalf(format string, args ...interface{}) { - glog.Fatalf(format, args...) + logger.Fatalf(format, args...) } func (sl *SignerLogger) Panicf(format string, args ...interface{}) { diff --git a/floors/fetcher.go b/floors/fetcher.go index c48b45fd7..c3d2a02f7 100644 --- a/floors/fetcher.go +++ b/floors/fetcher.go @@ -14,8 +14,8 @@ import ( "github.com/alitto/pond" validator "github.com/asaskevich/govalidator" "github.com/coocood/freecache" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/util/timeutil" @@ -90,7 +90,7 @@ func (fq *FetchQueue) Top() *fetchInfo { } func workerPanicHandler(p interface{}) { - glog.Errorf("floor fetcher worker panicked: %v", p) + logger.Errorf("floor fetcher worker panicked: %v", p) } func NewPriceFloorFetcher(config config.PriceFloors, httpClient *http.Client, metricEngine metrics.MetricsEngine) *PriceFloorFetcher { @@ -165,7 +165,7 @@ func (f *PriceFloorFetcher) worker(fetchConfig fetchInfo) { } floorData, err := json.Marshal(floorData) if err != nil { - glog.Errorf("Error while marshaling fetched floor data for url %s", fetchConfig.AccountFloorFetch.URL) + logger.Errorf("Error while marshaling fetched floor data for url %s", fetchConfig.AccountFloorFetch.URL) } else { f.SetWithExpiry(fetchConfig.AccountFloorFetch.URL, floorData, cacheExpiry) } @@ -224,7 +224,7 @@ func (f *PriceFloorFetcher) Fetcher() { } case <-f.done: ticker.Stop() - glog.Info("Price Floor fetcher terminated") + logger.Infof("Price Floor fetcher terminated") return } } @@ -233,23 +233,23 @@ func (f *PriceFloorFetcher) Fetcher() { func (f *PriceFloorFetcher) fetchAndValidate(config config.AccountFloorFetch) (*openrtb_ext.PriceFloorRules, int) { floorResp, maxAge, err := f.fetchFloorRulesFromURL(config) if floorResp == nil || err != nil { - glog.Errorf("Error while fetching floor data from URL: %s, reason : %s", config.URL, err.Error()) + logger.Errorf("Error while fetching floor data from URL: %s, reason : %s", config.URL, err.Error()) return nil, 0 } if len(floorResp) > (config.MaxFileSizeKB * 1024) { - glog.Errorf("Received invalid floor data from URL: %s, reason : floor file size is greater than MaxFileSize", config.URL) + logger.Errorf("Received invalid floor data from URL: %s, reason : floor file size is greater than MaxFileSize", config.URL) return nil, 0 } var priceFloors openrtb_ext.PriceFloorRules if err = json.Unmarshal(floorResp, &priceFloors.Data); err != nil { - glog.Errorf("Received invalid price floor json from URL: %s", config.URL) + logger.Errorf("Received invalid price floor json from URL: %s", config.URL) return nil, 0 } if err := validateRules(config, &priceFloors); err != nil { - glog.Errorf("Validation failed for floor JSON from URL: %s, reason: %s", config.URL, err.Error()) + logger.Errorf("Validation failed for floor JSON from URL: %s, reason: %s", config.URL, err.Error()) return nil, 0 } @@ -275,7 +275,7 @@ func (f *PriceFloorFetcher) fetchFloorRulesFromURL(config config.AccountFloorFet // read the entire response body to ensure full connection reuse if there's an // invalid status code if _, err := io.Copy(io.Discard, httpResp.Body); err != nil { - glog.Errorf("error while draining fetched floor response body: %v", err) + logger.Errorf("error while draining fetched floor response body: %v", err) } httpResp.Body.Close() }() @@ -288,10 +288,10 @@ func (f *PriceFloorFetcher) fetchFloorRulesFromURL(config config.AccountFloorFet if maxAgeStr := httpResp.Header.Get("max-age"); maxAgeStr != "" { maxAge, err = strconv.Atoi(maxAgeStr) if err != nil { - glog.Errorf("max-age in header is malformed for url %s", config.URL) + logger.Errorf("max-age in header is malformed for url %s", config.URL) } if maxAge <= config.Period || maxAge > math.MaxInt32 { - glog.Errorf("Invalid max-age = %s provided, value should be valid integer and should be within (%v, %v)", maxAgeStr, config.Period, math.MaxInt32) + logger.Errorf("Invalid max-age = %s provided, value should be valid integer and should be within (%v, %v)", maxAgeStr, config.Period, math.MaxInt32) } } diff --git a/floors/rule.go b/floors/rule.go index 189c765d3..fb3130c60 100644 --- a/floors/rule.go +++ b/floors/rule.go @@ -7,9 +7,9 @@ import ( "sort" "strings" - "github.com/golang/glog" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v3/currency" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/util/ptrutil" ) @@ -74,7 +74,7 @@ func getMinFloorValue(floorExt *openrtb_ext.PriceFloorRules, imp *openrtb_ext.Im floorCur = getFloorCurrency(floorExt) if floorMin > 0.0 && floorMinCur != "" { if floorExt.FloorMinCur != "" && impFloorCur != "" && floorExt.FloorMinCur != impFloorCur { - glog.Warning("FloorMinCur are different in floorExt and ImpExt") + logger.Warnf("FloorMinCur are different in floorExt and ImpExt") } if floorCur != "" && floorMinCur != floorCur { rate, err = conversions.GetRate(floorMinCur, floorCur) diff --git a/gdpr/vendorlist-fetching.go b/gdpr/vendorlist-fetching.go index c7b462a25..2a3be433e 100644 --- a/gdpr/vendorlist-fetching.go +++ b/gdpr/vendorlist-fetching.go @@ -10,11 +10,11 @@ import ( "sync/atomic" "time" - "github.com/golang/glog" "github.com/prebid/go-gdpr/api" "github.com/prebid/go-gdpr/vendorlist" "github.com/prebid/go-gdpr/vendorlist2" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" "golang.org/x/net/context/ctxhttp" ) @@ -119,24 +119,24 @@ func newOccasionalSaver(timeout time.Duration) func(ctx context.Context, client func saveOne(ctx context.Context, client *http.Client, url string, saver saveVendors, me metrics.MetricsEngine) uint16 { req, err := http.NewRequest("GET", url, nil) if err != nil { - glog.Errorf("Failed to build GET %s request. Cookie syncs may be affected: %v", url, err) + logger.Errorf("Failed to build GET %s request. Cookie syncs may be affected: %v", url, err) return 0 } resp, err := ctxhttp.Do(ctx, client, req) if err != nil { - glog.Errorf("Error calling GET %s. Cookie syncs may be affected: %v", url, err) + logger.Errorf("Error calling GET %s. Cookie syncs may be affected: %v", url, err) return 0 } defer resp.Body.Close() respBody, err := io.ReadAll(resp.Body) if err != nil { - glog.Errorf("Error reading response body from GET %s. Cookie syncs may be affected: %v", url, err) + logger.Errorf("Error reading response body from GET %s. Cookie syncs may be affected: %v", url, err) return 0 } if resp.StatusCode != http.StatusOK { - glog.Errorf("GET %s returned %d. Cookie syncs may be affected.", url, resp.StatusCode) + logger.Errorf("GET %s returned %d. Cookie syncs may be affected.", url, resp.StatusCode) me.RecordGvlListRequest() return 0 } @@ -145,7 +145,7 @@ func saveOne(ctx context.Context, client *http.Client, url string, saver saveVen var newList api.VendorList newList, err = vendorlist2.ParseEagerly(respBody) if err != nil { - glog.Errorf("GET %s returned malformed JSON. Cookie syncs may be affected. Error was %v. Body was %s", url, err, string(respBody)) + logger.Errorf("GET %s returned malformed JSON. Cookie syncs may be affected. Error was %v. Body was %s", url, err, string(respBody)) return 0 } diff --git a/hooks/hookexecution/context.go b/hooks/hookexecution/context.go index 128008001..75ad2a821 100644 --- a/hooks/hookexecution/context.go +++ b/hooks/hookexecution/context.go @@ -3,9 +3,9 @@ package hookexecution import ( "sync" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/hooks/hookstage" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/privacy" ) @@ -30,7 +30,7 @@ func (ctx executionContext) getModuleContext(moduleName string) hookstage.Module if ctx.account != nil { cfg, err := ctx.account.Hooks.Modules.ModuleConfig(moduleName) if err != nil { - glog.Warningf("Failed to get account config for %s module: %s", moduleName, err) + logger.Warnf("Failed to get account config for %s module: %s", moduleName, err) } moduleInvocationCtx.AccountID = ctx.accountID diff --git a/hooks/hookexecution/execution.go b/hooks/hookexecution/execution.go index d337ef03e..b14629efe 100644 --- a/hooks/hookexecution/execution.go +++ b/hooks/hookexecution/execution.go @@ -8,10 +8,10 @@ import ( "sync" "time" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/hooks" "github.com/prebid/prebid-server/v3/hooks/hookstage" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/ortb" @@ -109,7 +109,7 @@ func executeHook[H any, P any]( go func() { defer func() { if r := recover(); r != nil { - glog.Errorf("OpenRTB auction recovered panic in module hook %s.%s: %v, Stack trace is: %v", + logger.Errorf("OpenRTB auction recovered panic in module hook %s.%s: %v, Stack trace is: %v", hw.Module, hw.Code, r, string(debug.Stack())) } }() diff --git a/hooks/plan.go b/hooks/plan.go index 6257cf34d..dbf897e41 100644 --- a/hooks/plan.go +++ b/hooks/plan.go @@ -3,9 +3,9 @@ package hooks import ( "time" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/hooks/hookstage" + "github.com/prebid/prebid-server/v3/logger" ) type Stage string @@ -213,7 +213,7 @@ func getGroup[T any](getHookFn hookFn[T], cfg config.HookExecutionGroup) Group[T if h, ok := getHookFn(hookCfg.ModuleCode); ok { group.Hooks = append(group.Hooks, HookWrapper[T]{Module: hookCfg.ModuleCode, Code: hookCfg.HookImplCode, Hook: h}) } else { - glog.Warningf("Not found hook while building hook execution plan: %s %s", hookCfg.ModuleCode, hookCfg.HookImplCode) + logger.Warnf("Not found hook while building hook execution plan: %s %s", hookCfg.ModuleCode, hookCfg.HookImplCode) } } diff --git a/logger/glog.go b/logger/glog.go new file mode 100644 index 000000000..dfeb3530f --- /dev/null +++ b/logger/glog.go @@ -0,0 +1,41 @@ +package logger + +import ( + "github.com/golang/glog" +) + +// GlogLogger implements the Logger interface for logging using the glog library with configurable call depth. +type GlogLogger struct { + depth int +} + +// Debug logs a debug-level message with the specified format and arguments. +func (logger *GlogLogger) Debugf(msg string, args ...any) { + glog.InfoDepthf(logger.depth, msg, args...) +} + +// Info logs an informational-level message with the specified format and optional arguments. +func (logger *GlogLogger) Infof(msg string, args ...any) { + glog.InfoDepthf(logger.depth, msg, args...) +} + +// Warn logs a warning-level message with the specified format and arguments. +func (logger *GlogLogger) Warnf(msg string, args ...any) { + glog.WarningDepthf(logger.depth, msg, args...) +} + +// Error logs an error-level message with the specified format and arguments. +func (logger *GlogLogger) Errorf(msg string, args ...any) { + glog.ErrorDepthf(logger.depth, msg, args...) +} + +// Fatal logs a fatal-level message with the specified format and arguments, then exits the application. +func (logger *GlogLogger) Fatalf(msg string, args ...any) { + glog.FatalDepthf(logger.depth, msg, args...) +} + +func NewGlogLogger() Logger { + return &GlogLogger{ + depth: 1, + } +} diff --git a/logger/glog_test.go b/logger/glog_test.go new file mode 100644 index 000000000..0af2394cb --- /dev/null +++ b/logger/glog_test.go @@ -0,0 +1,171 @@ +package logger + +import ( + "flag" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewGlogLogger(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + flag.Set("stderrthreshold", "INFO") + + logger := NewGlogLogger() + + assert.NotNil(t, logger, "NewGlogLogger should return a non-nil logger") + + glogLogger, ok := logger.(*GlogLogger) + assert.True(t, ok, "Logger should be of type *GlogLogger") + assert.Equal(t, 1, glogLogger.depth, "Default depth should be 1") +} + +func TestGlogLogger_ImplementsLoggerInterface(t *testing.T) { + var _ Logger = (*GlogLogger)(nil) +} + +func TestGlogLogger_Debug(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + flag.Set("v", "2") + + logger := NewGlogLogger() + + // This test verifies the method can be called without panicking + // Actual log output verification would require capturing stderr + assert.NotPanics(t, func() { + logger.Debugf("debug message") + }, "Debug should not panic") + + assert.NotPanics(t, func() { + logger.Debugf("debug message with args: %s, %d", "test", 123) + }, "Debug with args should not panic") +} + +func TestGlogLogger_Info(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + logger := NewGlogLogger() + + assert.NotPanics(t, func() { + logger.Infof("info message") + }, "Info should not panic") + + assert.NotPanics(t, func() { + logger.Infof("info message with args: %s, %d", "test", 456) + }, "Info with args should not panic") +} + +func TestGlogLogger_Warn(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + logger := NewGlogLogger() + + assert.NotPanics(t, func() { + logger.Warnf("warning message") + }, "Warn should not panic") + + assert.NotPanics(t, func() { + logger.Warnf("warning message with args: %s, %d", "test", 789) + }, "Warn with args should not panic") +} + +func TestGlogLogger_Error(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + logger := NewGlogLogger() + + assert.NotPanics(t, func() { + logger.Errorf("error message") + }, "Error should not panic") + + assert.NotPanics(t, func() { + logger.Errorf("error message with args: %s, %d", "test", 999) + }, "Error with args should not panic") +} + +func TestGlogLogger_AllLevels(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + flag.Set("v", "2") + + logger := NewGlogLogger() + + // Test that all logging levels work together + assert.NotPanics(t, func() { + logger.Debugf("debug") + logger.Infof("info") + logger.Warnf("warn") + logger.Errorf("error") + }, "All logging levels should work without panic") +} + +func TestGlogLogger_Depth(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + glogLogger := &GlogLogger{depth: 2} + + // Test with custom depth + assert.NotPanics(t, func() { + glogLogger.Infof("info with custom depth") + }, "Logger with custom depth should not panic") +} + +func TestGlogLogger_EmptyMessage(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + logger := NewGlogLogger() + + // Test with empty messages + assert.NotPanics(t, func() { + logger.Infof("") + logger.Debugf("") + logger.Warnf("") + logger.Errorf("") + }, "Empty messages should not panic") +} + +func TestGlogLogger_NoArgs(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + logger := NewGlogLogger() + + // Test logging without variadic args + assert.NotPanics(t, func() { + logger.Infof("simple message") + logger.Debugf("simple debug") + logger.Warnf("simple warning") + logger.Errorf("simple error") + }, "Messages without args should not panic") +} + +func TestGlogLogger_MultipleArgs(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + logger := NewGlogLogger() + + // Test with multiple arguments + assert.NotPanics(t, func() { + logger.Infof("message: %s, number: %d, float: %f, bool: %v", "test", 42, 3.14, true) + }, "Messages with multiple args should not panic") +} + +func TestGlogLogger_SpecialCharacters(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + logger := NewGlogLogger() + + // Test with special characters + assert.NotPanics(t, func() { + logger.Infof("message with special chars: \n\t\"quotes\" and 'apostrophes'") + }, "Messages with special characters should not panic") +} diff --git a/logger/interface.go b/logger/interface.go new file mode 100644 index 000000000..4d840381b --- /dev/null +++ b/logger/interface.go @@ -0,0 +1,18 @@ +package logger + +type Logger interface { + // Debugf level logging + Debugf(msg string, args ...any) + + // Infof level logging + Infof(msg string, args ...any) + + // Warnf level logging + Warnf(msg string, args ...any) + + // Errorf level logging + Errorf(msg string, args ...any) + + // Fatalf level logging + Fatalf(msg string, args ...any) +} diff --git a/logger/logger.go b/logger/logger.go new file mode 100644 index 000000000..ecaf46e1c --- /dev/null +++ b/logger/logger.go @@ -0,0 +1,28 @@ +package logger + +var logger Logger = NewGlogLogger() + +// Debugf level logging +func Debugf(msg string, args ...any) { + logger.Debugf(msg, args...) +} + +// Infof level logging +func Infof(msg string, args ...any) { + logger.Infof(msg, args...) +} + +// Warnf level logging +func Warnf(msg string, args ...any) { + logger.Warnf(msg, args...) +} + +// Errorf level logging +func Errorf(msg string, args ...any) { + logger.Errorf(msg, args...) +} + +// Fatalf level logging and terminates the program execution. +func Fatalf(msg string, args ...any) { + logger.Fatalf(msg, args...) +} diff --git a/logger/logger_test.go b/logger/logger_test.go new file mode 100644 index 000000000..1b7f285e9 --- /dev/null +++ b/logger/logger_test.go @@ -0,0 +1,304 @@ +package logger + +import ( + "flag" + "testing" + + "github.com/stretchr/testify/assert" +) + +// mockLogger is a test implementation of the Logger interface +type mockLogger struct { + debugCalls []logCall + infoCalls []logCall + warnCalls []logCall + errorCalls []logCall + fatalCalls []logCall +} + +type logCall struct { + msg string + args []any +} + +func (m *mockLogger) Debugf(msg string, args ...any) { + m.debugCalls = append(m.debugCalls, logCall{msg, args}) +} + +func (m *mockLogger) Infof(msg string, args ...any) { + m.infoCalls = append(m.infoCalls, logCall{msg, args}) +} + +func (m *mockLogger) Warnf(msg string, args ...any) { + m.warnCalls = append(m.warnCalls, logCall{msg, args}) +} + +func (m *mockLogger) Errorf(msg string, args ...any) { + m.errorCalls = append(m.errorCalls, logCall{msg, args}) +} + +func (m *mockLogger) Fatalf(msg string, args ...any) { + m.fatalCalls = append(m.fatalCalls, logCall{msg, args}) +} + +func newMockLogger() *mockLogger { + return &mockLogger{ + debugCalls: []logCall{}, + infoCalls: []logCall{}, + warnCalls: []logCall{}, + errorCalls: []logCall{}, + fatalCalls: []logCall{}, + } +} + +func TestDefaultLogger(t *testing.T) { + // The default logger should be GlogLogger + defaultLogger := logger + assert.NotNil(t, defaultLogger, "Default logger should not be nil") + + _, ok := defaultLogger.(*GlogLogger) + assert.True(t, ok, "Default logger should be *GlogLogger") +} + +func TestDebug(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + flag.Set("v", "2") + + mock := newMockLogger() + logger = mock + + Debugf("debug message") + assert.Len(t, mock.debugCalls, 1, "Should have one debug call") + assert.Equal(t, "debug message", mock.debugCalls[0].msg) + assert.Empty(t, mock.debugCalls[0].args) + + Debugf("debug with args: %s, %d", "test", 123) + assert.Len(t, mock.debugCalls, 2, "Should have two debug calls") + assert.Equal(t, "debug with args: %s, %d", mock.debugCalls[1].msg) + assert.Equal(t, []any{"test", 123}, mock.debugCalls[1].args) + + // Restore default logger + logger = NewGlogLogger() +} + +func TestInfo(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + mock := newMockLogger() + logger = mock + + Infof("info message") + assert.Len(t, mock.infoCalls, 1, "Should have one info call") + assert.Equal(t, "info message", mock.infoCalls[0].msg) + assert.Empty(t, mock.infoCalls[0].args) + + Infof("info with args: %s, %d", "test", 456) + assert.Len(t, mock.infoCalls, 2, "Should have two info calls") + assert.Equal(t, "info with args: %s, %d", mock.infoCalls[1].msg) + assert.Equal(t, []any{"test", 456}, mock.infoCalls[1].args) + + // Restore default logger + logger = NewGlogLogger() +} + +func TestWarn(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + mock := newMockLogger() + logger = mock + + Warnf("warning message") + assert.Len(t, mock.warnCalls, 1, "Should have one warn call") + assert.Equal(t, "warning message", mock.warnCalls[0].msg) + assert.Empty(t, mock.warnCalls[0].args) + + Warnf("warning with args: %s, %d", "test", 789) + assert.Len(t, mock.warnCalls, 2, "Should have two warn calls") + assert.Equal(t, "warning with args: %s, %d", mock.warnCalls[1].msg) + assert.Equal(t, []any{"test", 789}, mock.warnCalls[1].args) + + // Restore default logger + logger = NewGlogLogger() +} + +func TestError(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + mock := newMockLogger() + logger = mock + + Errorf("error message") + assert.Len(t, mock.errorCalls, 1, "Should have one error call") + assert.Equal(t, "error message", mock.errorCalls[0].msg) + assert.Empty(t, mock.errorCalls[0].args) + + Errorf("error with args: %s, %d", "test", 999) + assert.Len(t, mock.errorCalls, 2, "Should have two error calls") + assert.Equal(t, "error with args: %s, %d", mock.errorCalls[1].msg) + assert.Equal(t, []any{"test", 999}, mock.errorCalls[1].args) + + // Restore default logger + logger = NewGlogLogger() +} + +func TestAllLogLevels(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + flag.Set("v", "2") + + mock := newMockLogger() + logger = mock + + Debugf("debug") + Infof("info") + Warnf("warn") + Errorf("error") + Fatalf("fatal") + + assert.Len(t, mock.debugCalls, 1, "Should have one debug call") + assert.Len(t, mock.infoCalls, 1, "Should have one info call") + assert.Len(t, mock.warnCalls, 1, "Should have one warn call") + assert.Len(t, mock.errorCalls, 1, "Should have one error call") + assert.Len(t, mock.fatalCalls, 1, "Should have one fatal call") + + // Restore default logger + logger = NewGlogLogger() +} + +func TestEmptyMessages(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + mock := newMockLogger() + logger = mock + + Debugf("") + Infof("") + Warnf("") + Errorf("") + Fatalf("") + + assert.Len(t, mock.debugCalls, 1, "Should have one debug call") + assert.Len(t, mock.infoCalls, 1, "Should have one info call") + assert.Len(t, mock.warnCalls, 1, "Should have one warn call") + assert.Len(t, mock.errorCalls, 1, "Should have one error call") + assert.Len(t, mock.fatalCalls, 1, "Should have one fatal call") + + assert.Equal(t, "", mock.debugCalls[0].msg) + assert.Equal(t, "", mock.infoCalls[0].msg) + assert.Equal(t, "", mock.warnCalls[0].msg) + assert.Equal(t, "", mock.errorCalls[0].msg) + assert.Equal(t, "", mock.fatalCalls[0].msg) + + // Restore default logger + logger = NewGlogLogger() +} + +func TestMultipleArguments(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + mock := newMockLogger() + logger = mock + + Infof("message: %s, number: %d, float: %f, bool: %v", "test", 42, 3.14, true) + + assert.Len(t, mock.infoCalls, 1, "Should have one info call") + assert.Equal(t, "message: %s, number: %d, float: %f, bool: %v", mock.infoCalls[0].msg) + assert.Equal(t, []any{"test", 42, 3.14, true}, mock.infoCalls[0].args) + + // Restore default logger + logger = NewGlogLogger() +} + +func TestNoArgs(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + mock := newMockLogger() + logger = mock + + Infof("simple message") + Debugf("simple debug") + Warnf("simple warning") + Errorf("simple error") + Fatalf("simple fatal") + + assert.Len(t, mock.infoCalls, 1, "Should have one info call") + assert.Len(t, mock.debugCalls, 1, "Should have one debug call") + assert.Len(t, mock.warnCalls, 1, "Should have one warn call") + assert.Len(t, mock.errorCalls, 1, "Should have one error call") + assert.Len(t, mock.fatalCalls, 1, "Should have one fatal call") + + assert.Empty(t, mock.infoCalls[0].args) + assert.Empty(t, mock.debugCalls[0].args) + assert.Empty(t, mock.warnCalls[0].args) + assert.Empty(t, mock.errorCalls[0].args) + assert.Empty(t, mock.fatalCalls[0].args) + + // Restore default logger + logger = NewGlogLogger() +} + +func TestWithRealGlogLogger(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + flag.Set("v", "2") + + // Use real GlogLogger + logger = NewGlogLogger() + + // These should not panic + assert.NotPanics(t, func() { + Debugf("debug message") + Infof("info message") + Warnf("warning message") + Errorf("error message") + }, "Real GlogLogger should not panic") +} + +func TestSpecialCharacters(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + mock := newMockLogger() + logger = mock + + Infof("message with special chars: \n\t\"quotes\" and 'apostrophes'") + + assert.Len(t, mock.infoCalls, 1, "Should have one info call") + assert.Equal(t, "message with special chars: \n\t\"quotes\" and 'apostrophes'", mock.infoCalls[0].msg) + + // Restore default logger + logger = NewGlogLogger() +} + +func TestLoggerInterfaceCompliance(t *testing.T) { + var _ Logger = (*mockLogger)(nil) + var _ Logger = (*GlogLogger)(nil) +} + +func TestFatal(t *testing.T) { + // Initialize glog flags + flag.Set("logtostderr", "true") + + mock := newMockLogger() + logger = mock + + Fatalf("fatal message") + assert.Len(t, mock.fatalCalls, 1, "Should have one fatal call") + assert.Equal(t, "fatal message", mock.fatalCalls[0].msg) + assert.Empty(t, mock.fatalCalls[0].args) + + Fatalf("fatal with args: %s, %d", "test", 111) + assert.Len(t, mock.fatalCalls, 2, "Should have two fatal calls") + assert.Equal(t, "fatal with args: %s, %d", mock.fatalCalls[1].msg) + assert.Equal(t, []any{"test", 111}, mock.fatalCalls[1].args) + + // Restore default logger + logger = NewGlogLogger() +} diff --git a/main.go b/main.go index 19ec33ff2..255509ec1 100644 --- a/main.go +++ b/main.go @@ -10,13 +10,13 @@ import ( jsoniter "github.com/json-iterator/go" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/currency" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/router" "github.com/prebid/prebid-server/v3/server" "github.com/prebid/prebid-server/v3/util/jsonutil" "github.com/prebid/prebid-server/v3/util/task" - "github.com/golang/glog" "github.com/spf13/viper" _ "go.uber.org/automaxprocs" ) @@ -30,16 +30,17 @@ func main() { bidderInfoPath, err := filepath.Abs(infoDirectory) if err != nil { - glog.Exitf("Unable to build configuration directory path: %v", err) + logger.Fatalf("Unable to build configuration directory path: %v", err) } bidderInfos, err := config.LoadBidderInfoFromDisk(bidderInfoPath) if err != nil { - glog.Exitf("Unable to load bidder configurations: %v", err) + logger.Fatalf("Unable to load bidder configurations: %v", err) } + cfg, err := loadConfig(bidderInfos) if err != nil { - glog.Exitf("Configuration could not be loaded or did not pass validation: %v", err) + logger.Fatalf("Configuration could not be loaded or did not pass validation: %v", err) } // Create a soft memory limit on the total amount of memory that PBS uses to tune the behavior @@ -52,7 +53,7 @@ func main() { err = serve(cfg) if err != nil { - glog.Exitf("prebid-server failed: %v", err) + logger.Fatalf("prebid-server failed: %v", err) } } @@ -81,7 +82,7 @@ func serve(cfg *config.Configuration) error { corsRouter := router.SupportCORS(r) if err := server.Listen(cfg, router.NoCache{Handler: corsRouter}, router.Admin(currencyConverter, fetchingInterval), r.MetricsEngine); err != nil { - glog.Fatalf("prebid-server returned an error: %v", err) + logger.Fatalf("prebid-server returned an error: %v", err) } r.Shutdown() diff --git a/metrics/go_metrics.go b/metrics/go_metrics.go index f92311264..20270e5fb 100644 --- a/metrics/go_metrics.go +++ b/metrics/go_metrics.go @@ -6,8 +6,8 @@ import ( "sync" "time" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/openrtb_ext" metrics "github.com/rcrowley/go-metrics" ) @@ -777,7 +777,7 @@ func (me *Metrics) RecordAdapterPanic(labels AdapterLabels) { lowerCaseAdapterName := strings.ToLower(adapterStr) am, ok := me.AdapterMetrics[lowerCaseAdapterName] if !ok { - glog.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) + logger.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) return } am.PanicMeter.Mark(1) @@ -789,7 +789,7 @@ func (me *Metrics) RecordAdapterRequest(labels AdapterLabels) { lowerCaseAdapter := strings.ToLower(adapterStr) am, ok := me.AdapterMetrics[lowerCaseAdapter] if !ok { - glog.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) + logger.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) return } @@ -806,7 +806,7 @@ func (me *Metrics) RecordAdapterRequest(labels AdapterLabels) { aam.GotBidsMeter.Mark(1) } default: - glog.Warningf("No go-metrics logged for AdapterBids value: %s", labels.AdapterBids) + logger.Warnf("No go-metrics logged for AdapterBids value: %s", labels.AdapterBids) } for errType := range labels.AdapterErrors { am.ErrorMeters[errType].Mark(1) @@ -829,7 +829,7 @@ func (me *Metrics) RecordAdapterConnections(adapterName openrtb_ext.BidderName, lowerCaseAdapterName := strings.ToLower(string(adapterName)) am, ok := me.AdapterMetrics[lowerCaseAdapterName] if !ok { - glog.Errorf("Trying to log adapter connection metrics for %s: adapter not found", string(adapterName)) + logger.Errorf("Trying to log adapter connection metrics for %s: adapter not found", string(adapterName)) return } @@ -860,7 +860,7 @@ func (me *Metrics) RecordAdapterBidReceived(labels AdapterLabels, bidType openrt lowerCaseAdapterName := strings.ToLower(adapterStr) am, ok := me.AdapterMetrics[lowerCaseAdapterName] if !ok { - glog.Errorf("Trying to run adapter bid metrics on %s: adapter metrics not found", adapterStr) + logger.Errorf("Trying to run adapter bid metrics on %s: adapter metrics not found", adapterStr) return } @@ -878,7 +878,7 @@ func (me *Metrics) RecordAdapterBidReceived(labels AdapterLabels, bidType openrt metricsForType.NurlMeter.Mark(1) } } else { - glog.Errorf("bid/adm metrics map entry does not exist for type %s. This is a bug, and should be reported.", bidType) + logger.Errorf("bid/adm metrics map entry does not exist for type %s. This is a bug, and should be reported.", bidType) } } @@ -888,7 +888,7 @@ func (me *Metrics) RecordAdapterPrice(labels AdapterLabels, cpm float64) { lowercaseAdapter := strings.ToLower(adapterStr) am, ok := me.AdapterMetrics[lowercaseAdapter] if !ok { - glog.Errorf("Trying to run adapter price metrics on %s: adapter metrics not found", adapterStr) + logger.Errorf("Trying to run adapter price metrics on %s: adapter metrics not found", adapterStr) return } // Adapter metrics @@ -905,7 +905,7 @@ func (me *Metrics) RecordAdapterTime(labels AdapterLabels, length time.Duration) lowercaseAdapter := strings.ToLower(adapterStr) am, ok := me.AdapterMetrics[lowercaseAdapter] if !ok { - glog.Errorf("Trying to run adapter latency metrics on %s: adapter metrics not found", string(labels.Adapter)) + logger.Errorf("Trying to run adapter latency metrics on %s: adapter metrics not found", string(labels.Adapter)) return } // Adapter metrics @@ -1031,7 +1031,7 @@ func (me *Metrics) RecordAdapterBuyerUIDScrubbed(adapterName openrtb_ext.BidderN am, ok := me.AdapterMetrics[strings.ToLower(adapterStr)] if !ok { - glog.Errorf("Trying to log adapter buyeruid scrubbed metric for %s: adapter not found", adapterStr) + logger.Errorf("Trying to log adapter buyeruid scrubbed metric for %s: adapter not found", adapterStr) return } @@ -1046,7 +1046,7 @@ func (me *Metrics) RecordAdapterGDPRRequestBlocked(adapterName openrtb_ext.Bidde am, ok := me.AdapterMetrics[strings.ToLower(adapterStr)] if !ok { - glog.Errorf("Trying to log adapter GDPR request blocked metric for %s: adapter not found", adapterStr) + logger.Errorf("Trying to log adapter GDPR request blocked metric for %s: adapter not found", adapterStr) return } @@ -1069,7 +1069,7 @@ func (me *Metrics) RecordBidValidationCreativeSizeError(adapter openrtb_ext.Bidd adapterStr := string(adapter) am, ok := me.AdapterMetrics[strings.ToLower(adapterStr)] if !ok { - glog.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) + logger.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) return } am.BidValidationCreativeSizeErrorMeter.Mark(1) @@ -1084,7 +1084,7 @@ func (me *Metrics) RecordBidValidationCreativeSizeWarn(adapter openrtb_ext.Bidde adapterStr := string(adapter) am, ok := me.AdapterMetrics[strings.ToLower(adapterStr)] if !ok { - glog.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) + logger.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) return } am.BidValidationCreativeSizeWarnMeter.Mark(1) @@ -1099,7 +1099,7 @@ func (me *Metrics) RecordBidValidationSecureMarkupError(adapter openrtb_ext.Bidd adapterStr := string(adapter) am, ok := me.AdapterMetrics[strings.ToLower(adapterStr)] if !ok { - glog.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) + logger.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) return } am.BidValidationSecureMarkupErrorMeter.Mark(1) @@ -1114,7 +1114,7 @@ func (me *Metrics) RecordBidValidationSecureMarkupWarn(adapter openrtb_ext.Bidde adapterStr := string(adapter) am, ok := me.AdapterMetrics[strings.ToLower(adapterStr)] if !ok { - glog.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) + logger.Errorf("Trying to run adapter metrics on %s: adapter metrics not found", adapterStr) return } am.BidValidationSecureMarkupWarnMeter.Mark(1) @@ -1250,7 +1250,7 @@ func (me *Metrics) getModuleMetric(labels ModuleLabels) (*ModuleMetrics, error) mm, ok := me.ModuleMetrics[labels.Module][labels.Stage] if !ok { err := fmt.Errorf("Trying to run module %s metrics for stage %s: module metrics not found", labels.Module, labels.Stage) - glog.Errorf(err.Error()) + logger.Errorf("%v", err) return nil, err } @@ -1261,7 +1261,7 @@ func (me *Metrics) RecordAdapterThrottled(adapterName openrtb_ext.BidderName) { adapterStr := adapterName.String() am, ok := me.AdapterMetrics[strings.ToLower(adapterStr)] if !ok { - glog.Errorf("Trying to log adapter throttled metric for %s: adapter not found", adapterStr) + logger.Errorf("Trying to log adapter throttled metric for %s: adapter not found", adapterStr) return } diff --git a/modules/fiftyonedegrees/devicedetection/device_info_extractor.go b/modules/fiftyonedegrees/devicedetection/device_info_extractor.go index 5f70ad584..d16ac64f0 100644 --- a/modules/fiftyonedegrees/devicedetection/device_info_extractor.go +++ b/modules/fiftyonedegrees/devicedetection/device_info_extractor.go @@ -6,7 +6,7 @@ import ( "fmt" "strconv" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" ) // deviceInfoExtractor is a struct that contains the methods to extract device information @@ -104,18 +104,18 @@ func (x deviceInfoExtractor) getValue(results Results, propertyName deviceInfoPr ",", ) if err != nil { - glog.Errorf("Failed to get results values string.") + logger.Errorf("Failed to get results values string.") return "" } hasValues, err := results.HasValues(string(propertyName)) if err != nil { - glog.Errorf("Failed to check if a matched value exists for property %s.\n", propertyName) + logger.Errorf("Failed to check if a matched value exists for property %s.\n", propertyName) return "" } if !hasValues { - glog.Warningf("Property %s does not have a matched value.\n", propertyName) + logger.Warnf("Property %s does not have a matched value.\n", propertyName) return "Unknown" } diff --git a/modules/modules.go b/modules/modules.go index 59c3c0f3a..fc2e15e7e 100644 --- a/modules/modules.go +++ b/modules/modules.go @@ -4,9 +4,9 @@ import ( "encoding/json" "fmt" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/hooks" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/modules/moduledeps" "github.com/prebid/prebid-server/v3/util/jsonutil" ) @@ -71,7 +71,7 @@ func (m *builder) Build( } if !isEnabled { - glog.Infof("Skip %s module, disabled.", id) + logger.Infof("Skip %s module, disabled.", id) continue } diff --git a/modules/scope3/rtd/module.go b/modules/scope3/rtd/module.go index e4c19380b..15fab4fc6 100644 --- a/modules/scope3/rtd/module.go +++ b/modules/scope3/rtd/module.go @@ -18,11 +18,11 @@ import ( "time" "github.com/coocood/freecache" - "github.com/golang/glog" jsoniter "github.com/json-iterator/go" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v3/hooks/hookanalytics" "github.com/prebid/prebid-server/v3/hooks/hookstage" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/modules/moduledeps" "github.com/prebid/prebid-server/v3/util/iterutil" "github.com/prebid/prebid-server/v3/util/jsonutil" @@ -447,7 +447,7 @@ func (m *Module) fetchScope3Segments(ctx context.Context, bidRequest *openrtb2.B // Cache the result err = m.cache.Set(cacheKey, []byte(strings.Join(segments, ",")), m.cfg.CacheTTL) if err != nil { - glog.Infof("could not set segments in cache: %v", err) + logger.Infof("could not set segments in cache: %v", err) } return segments, nil diff --git a/modules/shutdown.go b/modules/shutdown.go index 49fabadfc..ae769ddf5 100644 --- a/modules/shutdown.go +++ b/modules/shutdown.go @@ -1,7 +1,7 @@ package modules import ( - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" ) // Shutdowner is an interface that defines a method for shutting down modules. @@ -33,7 +33,7 @@ func NewShutdownModules(modules map[string]interface{}) *ShutdownModules { func (s *ShutdownModules) Shutdown() { for _, module := range s.modules { if err := module.Shutdown(); err != nil { - glog.Errorf("Error shutting down module: %v", err) + logger.Errorf("Error shutting down module: %v", err) } } return diff --git a/pbs/usersync.go b/pbs/usersync.go index bd99eb7d1..2a88ecc7b 100644 --- a/pbs/usersync.go +++ b/pbs/usersync.go @@ -10,9 +10,9 @@ import ( "net/url" "strings" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/usersync" ) @@ -51,7 +51,7 @@ func (deps *UserSyncDeps) VerifyRecaptcha(response string) error { // read the entire response body to ensure full connection reuse if there's an // error while decoding the json if _, err := io.Copy(io.Discard, resp.Body); err != nil { - glog.Errorf("Captcha verify draining response body failed: %v", err) + logger.Errorf("Captcha verify draining response body failed: %v", err) } resp.Body.Close() }() @@ -79,9 +79,7 @@ func (deps *UserSyncDeps) OptOut(w http.ResponseWriter, r *http.Request, _ httpr err := deps.VerifyRecaptcha(rr) if err != nil { - if glog.V(2) { - glog.Infof("Opt Out failed recaptcha: %v", err) - } + logger.Infof("Opt Out failed recaptcha: %v", err) w.WriteHeader(http.StatusUnauthorized) return } diff --git a/prebid_cache_client/client.go b/prebid_cache_client/client.go index c0a7ff83e..adc57b97a 100644 --- a/prebid_cache_client/client.go +++ b/prebid_cache_client/client.go @@ -13,10 +13,10 @@ import ( "time" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" "github.com/buger/jsonparser" - "github.com/golang/glog" "golang.org/x/net/context/ctxhttp" ) @@ -150,7 +150,7 @@ func (c *clientImpl) PutJson(ctx context.Context, values []Cacheable) (uuids []s func logError(errs *[]error, format string, a ...interface{}) { msg := fmt.Sprintf(format, a...) - glog.Error(msg) + logger.Errorf(msg) *errs = append(*errs, errors.New(msg)) } diff --git a/router/router.go b/router/router.go index 3063d851d..45099477f 100644 --- a/router/router.go +++ b/router/router.go @@ -25,6 +25,7 @@ import ( "github.com/prebid/prebid-server/v3/floors" "github.com/prebid/prebid-server/v3/gdpr" "github.com/prebid/prebid-server/v3/hooks" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/macros" "github.com/prebid/prebid-server/v3/metrics" metricsConf "github.com/prebid/prebid-server/v3/metrics/config" @@ -43,7 +44,6 @@ import ( "github.com/prebid/prebid-server/v3/version" _ "github.com/go-sql-driver/mysql" - "github.com/golang/glog" "github.com/julienschmidt/httprouter" _ "github.com/lib/pq" "github.com/rs/cors" @@ -67,7 +67,7 @@ func newJsonDirectoryServer(schemaDirectory string, validator openrtb_ext.Bidder // Slurp the files into memory first, since they're small and it minimizes request latency. files, err := os.ReadDir(schemaDirectory) if err != nil { - glog.Fatalf("Failed to read directory %s: %v", schemaDirectory, err) + logger.Fatalf("Failed to read directory %s: %v", schemaDirectory, err) } bidderMap := openrtb_ext.BuildBidderMap() @@ -77,7 +77,7 @@ func newJsonDirectoryServer(schemaDirectory string, validator openrtb_ext.Bidder bidder := strings.TrimSuffix(file.Name(), ".json") bidderName, isValid := bidderMap[bidder] if !isValid { - glog.Fatalf("Schema exists for an unknown bidder: %s", bidder) + logger.Fatalf("Schema exists for an unknown bidder: %s", bidder) } data[bidder] = json.RawMessage(validator.Schema(bidderName)) } @@ -89,7 +89,7 @@ func newJsonDirectoryServer(schemaDirectory string, validator openrtb_ext.Bidder response, err := jsonutil.Marshal(data) if err != nil { - glog.Fatalf("Failed to marshal bidder param JSON-schema: %v", err) + logger.Fatalf("Failed to marshal bidder param JSON-schema: %v", err) } return func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) { @@ -132,13 +132,13 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R // local file system certPool, certPoolCreateErr := ssl.CreateCertPool(cfg.CertsUseSystem) if certPoolCreateErr != nil { - glog.Infof("Could not load root certificates: %s \n", certPoolCreateErr.Error()) + logger.Infof("Could not load root certificates: %s \n", certPoolCreateErr.Error()) } var readCertErr error certPool, readCertErr = ssl.AppendPEMFileToRootCAPool(certPool, cfg.PemCertsFile) if readCertErr != nil { - glog.Infof("Could not read certificates file: %s \n", readCertErr.Error()) + logger.Infof("Could not read certificates file: %s \n", readCertErr.Error()) } generalHttpClient := &http.Client{ @@ -212,7 +212,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R moduleDeps := moduledeps.ModuleDeps{HTTPClient: generalHttpClient, RateConvertor: rateConvertor, Geoscope: normalizedGeoscopes} repo, moduleStageNames, shutdownModules, err := modules.NewBuilder().Build(cfg.Hooks.Modules, moduleDeps) if err != nil { - glog.Fatalf("Failed to init hook modules: %v", err) + logger.Fatalf("Failed to init hook modules: %v", err) } // Metrics engine @@ -226,7 +226,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R paramsValidator, err := openrtb_ext.NewBidderParamsValidator(schemaDirectory) if err != nil { - glog.Fatalf("Failed to create the bidder params validator. %v", err) + logger.Fatalf("Failed to create the bidder params validator. %v", err) } activeBidders := exchange.GetActiveBidders(cfg.BidderInfos) @@ -248,7 +248,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R } adsCertSigner, err := adscert.NewAdCertsSigner(cfg.Experiment.AdCerts) if err != nil { - glog.Fatalf("Failed to create ads cert signer: %v", err) + logger.Fatalf("Failed to create ads cert signer: %v", err) } requestValidator := ortb.NewRequestValidator(activeBidders, disabledBidders, paramsValidator) @@ -261,17 +261,17 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R var uuidGenerator uuidutil.UUIDRandomGenerator openrtbEndpoint, err := openrtb2.NewEndpoint(uuidGenerator, theExchange, requestValidator, fetcher, accounts, cfg, r.MetricsEngine, analyticsRunner, disabledBidders, defReqJSON, activeBidders, storedRespFetcher, planBuilder, tmaxAdjustments) if err != nil { - glog.Fatalf("Failed to create the openrtb2 endpoint handler. %v", err) + logger.Fatalf("Failed to create the openrtb2 endpoint handler. %v", err) } ampEndpoint, err := openrtb2.NewAmpEndpoint(uuidGenerator, theExchange, requestValidator, ampFetcher, accounts, cfg, r.MetricsEngine, analyticsRunner, disabledBidders, defReqJSON, activeBidders, storedRespFetcher, planBuilder, tmaxAdjustments) if err != nil { - glog.Fatalf("Failed to create the amp endpoint handler. %v", err) + logger.Fatalf("Failed to create the amp endpoint handler. %v", err) } videoEndpoint, err := openrtb2.NewVideoEndpoint(uuidGenerator, theExchange, requestValidator, fetcher, videoFetcher, accounts, cfg, r.MetricsEngine, analyticsRunner, disabledBidders, defReqJSON, activeBidders, cacheClient, tmaxAdjustments) if err != nil { - glog.Fatalf("Failed to create the video endpoint handler. %v", err) + logger.Fatalf("Failed to create the video endpoint handler. %v", err) } requestTimeoutHeaders := config.RequestTimeoutHeaders{} @@ -325,11 +325,11 @@ func defaultTransportDialContext(dialer *net.Dialer) func(context.Context, strin // Shutdown closes any dependencies of the router that may need closing func (r *Router) Shutdown() { - glog.Info("[PBS Router] shutting down") + logger.Infof("[PBS Router] shutting down") for _, shutdown := range r.shutdowns { shutdown() } - glog.Info("[PBS Router] shut down") + logger.Infof("[PBS Router] shut down") } func checkSupportedUserSyncEndpoints(bidderInfos config.BidderInfos) error { @@ -343,11 +343,11 @@ func checkSupportedUserSyncEndpoints(bidderInfos config.BidderInfos) error { switch endpointLower { case "iframe": if info.Syncer.IFrame == nil { - glog.Warningf("bidder %s supports iframe user sync, but doesn't have a default and must be configured by the host", name) + logger.Warnf("bidder %s supports iframe user sync, but doesn't have a default and must be configured by the host", name) } case "redirect": if info.Syncer.Redirect == nil { - glog.Warningf("bidder %s supports redirect user sync, but doesn't have a default and must be configured by the host", name) + logger.Warnf("bidder %s supports redirect user sync, but doesn't have a default and must be configured by the host", name) } default: return fmt.Errorf("failed to load bidder info for %s, user sync supported endpoint '%s' is unrecognized", name, endpoint) @@ -398,13 +398,13 @@ func readDefaultRequestFromFile(defReqConfig config.DefReqConfig) []byte { defaultRequestJSON, err := os.ReadFile(defReqConfig.FileSystem.FileName) if err != nil { - glog.Fatalf("error reading default request from file %s: %v", defReqConfig.FileSystem.FileName, err) + logger.Fatalf("error reading default request from file %s: %v", defReqConfig.FileSystem.FileName, err) return []byte{} } // validate json is valid if err := jsonutil.UnmarshalValid(defaultRequestJSON, &openrtb2model.BidRequest{}); err != nil { - glog.Fatalf("error parsing default request from file %s: %v", defReqConfig.FileSystem.FileName, err) + logger.Fatalf("error parsing default request from file %s: %v", defReqConfig.FileSystem.FileName, err) return []byte{} } diff --git a/server/listener.go b/server/listener.go index 3bc1f2e66..ece1a6ec3 100644 --- a/server/listener.go +++ b/server/listener.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" ) @@ -31,7 +31,7 @@ func (l *monitorableConnection) Close() error { // in the core Go libs: https://github.com/golang/go/issues/4373#issuecomment-347680321 errString := err.Error() if !strings.Contains(errString, "use of closed network connection") { - glog.Errorf("Error closing connection: %s", errString) + logger.Errorf("Error closing connection: %s", errString) } l.metrics.RecordConnectionClose(false) } @@ -41,7 +41,7 @@ func (l *monitorableConnection) Close() error { func (ln *monitorableListener) Accept() (net.Conn, error) { tc, err := ln.Listener.Accept() if err != nil { - glog.Errorf("Error accepting connection: %v", err) + logger.Errorf("Error accepting connection: %v", err) ln.metrics.RecordConnectionAccept(false) return tc, err } diff --git a/server/prometheus.go b/server/prometheus.go index 98409e6a5..332eebdd1 100644 --- a/server/prometheus.go +++ b/server/prometheus.go @@ -1,21 +1,21 @@ package server import ( + "fmt" "net/http" "strconv" - "github.com/golang/glog" - "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" metricsconfig "github.com/prebid/prebid-server/v3/metrics/config" + "github.com/prometheus/client_golang/prometheus/promhttp" ) func newPrometheusServer(cfg *config.Configuration, metrics *metricsconfig.DetailedMetricsEngine) *http.Server { proMetrics := metrics.PrometheusMetrics if proMetrics == nil { - glog.Fatal("Prometheus metrics configured, but a Prometheus metrics engine was not found. Cannot set up a Prometheus listener.") + logger.Fatalf("Prometheus metrics configured, but a Prometheus metrics engine was not found. Cannot set up a Prometheus listener.") } return &http.Server{ Addr: cfg.Host + ":" + strconv.Itoa(cfg.Metrics.Prometheus.Port), @@ -30,5 +30,5 @@ func newPrometheusServer(cfg *config.Configuration, metrics *metricsconfig.Detai type loggerForPrometheus struct{} func (loggerForPrometheus) Println(v ...interface{}) { - glog.Warningln(v...) + logger.Warnf(fmt.Sprintln(v...)) } diff --git a/server/server.go b/server/server.go index 257ccea88..f46fdc8cf 100644 --- a/server/server.go +++ b/server/server.go @@ -12,8 +12,8 @@ import ( "time" "github.com/NYTimes/gziphandler" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" metricsconfig "github.com/prebid/prebid-server/v3/metrics/config" ) @@ -37,7 +37,7 @@ func Listen(cfg *config.Configuration, handler http.Handler, adminHandler http.H ) go shutdownAfterSignals(mainServer, stopMain, done) if socketListener, err = newUnixListener(mainServer.Addr, metrics); err != nil { - glog.Errorf("Error listening for Unix-Socket connections on path %s: %v for socket server", mainServer.Addr, err) + logger.Errorf("Error listening for Unix-Socket connections on path %s: %v for socket server", mainServer.Addr, err) return } go runServer(mainServer, "UnixSocket", socketListener) @@ -48,7 +48,7 @@ func Listen(cfg *config.Configuration, handler http.Handler, adminHandler http.H ) go shutdownAfterSignals(mainServer, stopMain, done) if mainListener, err = newTCPListener(mainServer.Addr, metrics); err != nil { - glog.Errorf("Error listening for TCP connections on %s: %v for main server", mainServer.Addr, err) + logger.Errorf("Error listening for TCP connections on %s: %v for main server", mainServer.Addr, err) return } go runServer(mainServer, "Main", mainListener) @@ -61,7 +61,7 @@ func Listen(cfg *config.Configuration, handler http.Handler, adminHandler http.H var adminListener net.Listener if adminListener, err = newTCPListener(adminServer.Addr, nil); err != nil { - glog.Errorf("Error listening for TCP connections on %s: %v for admin server", adminServer.Addr, err) + logger.Errorf("Error listening for TCP connections on %s: %v for admin server", adminServer.Addr, err) return } go runServer(adminServer, "Admin", adminListener) @@ -75,7 +75,7 @@ func Listen(cfg *config.Configuration, handler http.Handler, adminHandler http.H stopChannels = append(stopChannels, stopPrometheus) go shutdownAfterSignals(prometheusServer, stopPrometheus, done) if prometheusListener, err = newTCPListener(prometheusServer.Addr, nil); err != nil { - glog.Errorf("Error listening for TCP connections on %s: %v for prometheus server", prometheusServer.Addr, err) + logger.Errorf("Error listening for TCP connections on %s: %v for prometheus server", prometheusServer.Addr, err) return } @@ -127,17 +127,17 @@ func getCompressionEnabledHandler(h http.Handler, compressionInfo config.Compres func runServer(server *http.Server, name string, listener net.Listener) (err error) { if server == nil { err = fmt.Errorf(">> Server is a nil_ptr.") - glog.Errorf("%s server quit with error: %v", name, err) + logger.Errorf("%s server quit with error: %v", name, err) return } else if listener == nil { err = fmt.Errorf(">> Listener is a nil.") - glog.Errorf("%s server quit with error: %v", name, err) + logger.Errorf("%s server quit with error: %v", name, err) return } - glog.Infof("%s server starting on: %s", name, server.Addr) + logger.Infof("%s server starting on: %s", name, server.Addr) if err = server.Serve(listener); err != nil { - glog.Errorf("%s server quit with error: %v", name, err) + logger.Errorf("%s server quit with error: %v", name, err) } return } @@ -152,7 +152,7 @@ func newTCPListener(address string, metrics metrics.MetricsEngine) (net.Listener if casted, ok := ln.(*net.TCPListener); ok { ln = &tcpKeepAliveListener{casted} } else { - glog.Warning("net.Listen(\"tcp\", \"addr\") didn't return a TCPListener as it did in Go 1.9. Things will probably work fine... but this should be investigated.") + logger.Warnf("net.Listen(\"tcp\", \"addr\") didn't return a TCPListener as it did in Go 1.9. Things will probably work fine... but this should be investigated.") } if metrics != nil { @@ -171,7 +171,7 @@ func newUnixListener(address string, metrics metrics.MetricsEngine) (net.Listene if casted, ok := ln.(*net.UnixListener); ok { ln = &unixListener{casted} } else { - glog.Warning("net.Listen(\"unix\", \"addr\") didn't return an UnixListener.") + logger.Warnf("net.Listen(\"unix\", \"addr\") didn't return an UnixListener.") } if metrics != nil { @@ -200,9 +200,9 @@ func shutdownAfterSignals(server *http.Server, stopper <-chan os.Signal, done ch defer cancel() var s struct{} - glog.Infof("Stopping %s because of signal: %s", server.Addr, sig.String()) + logger.Infof("Stopping %s because of signal: %s", server.Addr, sig.String()) if err := server.Shutdown(ctx); err != nil { - glog.Errorf("Failed to shutdown %s: %v", server.Addr, err) + logger.Errorf("Failed to shutdown %s: %v", server.Addr, err) } done <- s } diff --git a/stored_requests/backends/db_fetcher/fetcher.go b/stored_requests/backends/db_fetcher/fetcher.go index 4fcebd3c6..fc16ca490 100644 --- a/stored_requests/backends/db_fetcher/fetcher.go +++ b/stored_requests/backends/db_fetcher/fetcher.go @@ -5,8 +5,7 @@ import ( "encoding/json" "github.com/lib/pq" - - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/stored_requests" "github.com/prebid/prebid-server/v3/stored_requests/backends/db_provider" ) @@ -18,13 +17,13 @@ func NewFetcher( ) stored_requests.AllFetcher { if provider == nil { - glog.Fatalf("The Database Stored Request Fetcher requires a database connection. Please report this as a bug.") + logger.Fatalf("The Database Stored Request Fetcher requires a database connection. Please report this as a bug.") } if queryTemplate == "" { - glog.Fatalf("The Database Stored Request Fetcher requires a queryTemplate. Please report this as a bug.") + logger.Fatalf("The Database Stored Request Fetcher requires a queryTemplate. Please report this as a bug.") } if responseQueryTemplate == "" { - glog.Fatalf("The Database Stored Response Fetcher requires a responseQueryTemplate. Please report this as a bug.") + logger.Fatalf("The Database Stored Response Fetcher requires a responseQueryTemplate. Please report this as a bug.") } return &dbFetcher{ provider: provider, @@ -62,7 +61,7 @@ func (fetcher *dbFetcher) FetchRequests(ctx context.Context, requestIDs []string rows, err := fetcher.provider.QueryContext(ctx, fetcher.queryTemplate, params...) if err != nil { if err != context.DeadlineExceeded && !isBadInput(err) { - glog.Errorf("Error reading from Stored Request DB: %s", err.Error()) + logger.Errorf("Error reading from Stored Request DB: %s", err.Error()) errs := appendErrors("Request", requestIDs, nil, nil) errs = appendErrors("Imp", impIDs, nil, errs) return nil, nil, errs @@ -71,7 +70,7 @@ func (fetcher *dbFetcher) FetchRequests(ctx context.Context, requestIDs []string } defer func() { if err := rows.Close(); err != nil { - glog.Errorf("error closing DB connection: %v", err) + logger.Errorf("error closing DB connection: %v", err) } }() @@ -93,7 +92,7 @@ func (fetcher *dbFetcher) FetchRequests(ctx context.Context, requestIDs []string case "imp": storedImpData[id] = data default: - glog.Errorf("Database result set with id=%s has invalid type: %s. This will be ignored.", id, dataType) + logger.Errorf("Database result set with id=%s has invalid type: %s. This will be ignored.", id, dataType) } } @@ -127,7 +126,7 @@ func (fetcher *dbFetcher) FetchResponses(ctx context.Context, ids []string) (dat } defer func() { if err := rows.Close(); err != nil { - glog.Errorf("error closing DB connection: %v", err) + logger.Errorf("error closing DB connection: %v", err) } }() diff --git a/stored_requests/backends/db_provider/db_provider.go b/stored_requests/backends/db_provider/db_provider.go index 01cd13b7b..be460bc35 100644 --- a/stored_requests/backends/db_provider/db_provider.go +++ b/stored_requests/backends/db_provider/db_provider.go @@ -4,8 +4,8 @@ import ( "context" "database/sql" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" ) type DbProvider interface { @@ -31,15 +31,15 @@ func NewDbProvider(dataType config.DataType, cfg config.DatabaseConnection) DbPr cfg: cfg, } default: - glog.Fatalf("Unsupported database driver %s", cfg.Driver) + logger.Fatalf("Unsupported database driver %s", cfg.Driver) return nil } if err := provider.Open(); err != nil { - glog.Fatalf("Failed to open %s database connection: %v", dataType, err) + logger.Fatalf("Failed to open %s database connection: %v", dataType, err) } if err := provider.Ping(); err != nil { - glog.Fatalf("Failed to ping %s database: %v", dataType, err) + logger.Fatalf("Failed to ping %s database: %v", dataType, err) } return provider diff --git a/stored_requests/backends/http_fetcher/fetcher.go b/stored_requests/backends/http_fetcher/fetcher.go index 6a23ec2a2..1950f2c3e 100644 --- a/stored_requests/backends/http_fetcher/fetcher.go +++ b/stored_requests/backends/http_fetcher/fetcher.go @@ -9,12 +9,11 @@ import ( "net/url" "strings" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/stored_requests" "github.com/prebid/prebid-server/v3/util/jsonutil" - jsonpatch "gopkg.in/evanphx/json-patch.v5" - - "github.com/golang/glog" "golang.org/x/net/context/ctxhttp" + jsonpatch "gopkg.in/evanphx/json-patch.v5" ) // NewFetcher returns a Fetcher which uses the Client to pull data from the endpoint. @@ -59,9 +58,9 @@ func NewFetcher(client *http.Client, endpoint string, useRfcCompliantBuilder boo endpointURL, err := url.Parse(endpoint) if err != nil { - glog.Fatalf(`Invalid endpoint "%s": %v`, endpoint, err) + logger.Fatalf(`Invalid endpoint "%s": %v`, endpoint, err) } - glog.Infof("Making http_fetcher for endpoint %v", endpoint) + logger.Infof("Making http_fetcher for endpoint %v", endpoint) return &HttpFetcher{ client: client, diff --git a/stored_requests/caches/memory/cache.go b/stored_requests/caches/memory/cache.go index c7c9f7cee..bae7a7ddc 100644 --- a/stored_requests/caches/memory/cache.go +++ b/stored_requests/caches/memory/cache.go @@ -6,7 +6,7 @@ import ( "sync" "github.com/coocood/freecache" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/stored_requests" ) @@ -19,10 +19,10 @@ import ( func NewCache(size int, ttl int, dataType string) stored_requests.CacheJSON { if ttl > 0 && size <= 0 { // a positive ttl indicates "LRU" cache type, while unlimited size indicates an "unbounded" cache type - glog.Fatalf("unbounded in-memory %s cache with TTL not allowed. Config validation should have caught this. Failing fast because something is buggy.", dataType) + logger.Fatalf("unbounded in-memory %s cache with TTL not allowed. Config validation should have caught this. Failing fast because something is buggy.", dataType) } if size > 0 { - glog.Infof("Using a Stored %s in-memory cache. Max size: %d bytes. TTL: %d seconds.", dataType, size, ttl) + logger.Infof("Using a Stored %s in-memory cache. Max size: %d bytes. TTL: %d seconds.", dataType, size, ttl) return &cache{ dataType: dataType, cache: &pbsLRUCache{ @@ -31,7 +31,7 @@ func NewCache(size int, ttl int, dataType string) stored_requests.CacheJSON { }, } } else { - glog.Infof("Using an unbounded Stored %s in-memory cache.", dataType) + logger.Infof("Using an unbounded Stored %s in-memory cache.", dataType) return &cache{ dataType: dataType, cache: &pbsSyncMap{&sync.Map{}}, diff --git a/stored_requests/caches/memory/maps.go b/stored_requests/caches/memory/maps.go index 9678c4b90..adf5b2a90 100644 --- a/stored_requests/caches/memory/maps.go +++ b/stored_requests/caches/memory/maps.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/coocood/freecache" - "github.com/golang/glog" + "github.com/prebid/prebid-server/v3/logger" ) // This file contains an interface and some wrapper types for various types of "map-like" structures @@ -52,14 +52,14 @@ func (m *pbsLRUCache) Get(id string) (json.RawMessage, bool) { return val, true } if err != freecache.ErrNotFound { - glog.Errorf("unexpected error from freecache: %v", err) + logger.Errorf("unexpected error from freecache: %v", err) } return val, false } func (m *pbsLRUCache) Set(id string, value json.RawMessage) { if err := m.Cache.Set([]byte(id), value, m.ttlSeconds); err != nil { - glog.Errorf("error saving value in freecache: %v", err) + logger.Errorf("error saving value in freecache: %v", err) } } diff --git a/stored_requests/config/config.go b/stored_requests/config/config.go index fd82e8784..5ff729cdd 100644 --- a/stored_requests/config/config.go +++ b/stored_requests/config/config.go @@ -5,11 +5,10 @@ import ( "net/http" "time" - "github.com/prebid/prebid-server/v3/metrics" - - "github.com/golang/glog" "github.com/julienschmidt/httprouter" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" + "github.com/prebid/prebid-server/v3/metrics" "github.com/prebid/prebid-server/v3/stored_requests" "github.com/prebid/prebid-server/v3/stored_requests/backends/db_fetcher" "github.com/prebid/prebid-server/v3/stored_requests/backends/db_provider" @@ -39,7 +38,7 @@ func CreateStoredRequests(cfg *config.StoredRequests, metricsEngine metrics.Metr // Create database connection if given options for one if cfg.Database.ConnectionInfo.Database != "" { if provider == nil { - glog.Infof("Connecting to Database for Stored %s. Driver=%s, DB=%s, host=%s, port=%d, user=%s", + logger.Infof("Connecting to Database for Stored %s. Driver=%s, DB=%s, host=%s, port=%d, user=%s", cfg.DataType(), cfg.Database.ConnectionInfo.Driver, cfg.Database.ConnectionInfo.Database, @@ -51,7 +50,7 @@ func CreateStoredRequests(cfg *config.StoredRequests, metricsEngine metrics.Metr // Error out if config is trying to use multiple database connections for different stored requests (not supported yet) if provider.Config() != cfg.Database.ConnectionInfo { - glog.Fatal("Multiple database connection settings found in config, only a single database connection is currently supported.") + logger.Fatalf("Multiple database connection settings found in config, only a single database connection is currently supported.") } } @@ -76,7 +75,7 @@ func CreateStoredRequests(cfg *config.StoredRequests, metricsEngine metrics.Metr } if err := provider.Close(); err != nil { - glog.Errorf("Error closing DB connection: %v", err) + logger.Errorf("Error closing DB connection: %v", err) } } @@ -157,7 +156,7 @@ func newFetcher(cfg *config.StoredRequests, client *http.Client, provider db_pro idList = append(idList, fFetcher) } if cfg.Database.FetcherQueries.QueryTemplate != "" { - glog.Infof("Loading Stored %s data via Database.\nQuery: %s", cfg.DataType(), cfg.Database.FetcherQueries.QueryTemplate) + logger.Infof("Loading Stored %s data via Database.\nQuery: %s", cfg.DataType(), cfg.Database.FetcherQueries.QueryTemplate) idList = append(idList, db_fetcher.NewFetcher(provider, cfg.Database.FetcherQueries.QueryTemplate, cfg.Database.FetcherQueries.QueryTemplate)) } else if cfg.Database.CacheInitialization.Query != "" && cfg.Database.PollUpdates.Query != "" { @@ -165,7 +164,7 @@ func newFetcher(cfg *config.StoredRequests, client *http.Client, provider db_pro idList = append(idList, empty_fetcher.EmptyFetcher{}) } if cfg.HTTP.Endpoint != "" { - glog.Infof("Loading Stored %s data via HTTP. endpoint=%s", cfg.DataType(), cfg.HTTP.Endpoint) + logger.Infof("Loading Stored %s data via HTTP. endpoint=%s", cfg.DataType(), cfg.HTTP.Endpoint) idList = append(idList, http_fetcher.NewFetcher(client, cfg.HTTP.Endpoint, cfg.HTTP.UseRfcCompliantBuilder)) } @@ -182,7 +181,7 @@ func newCache(cfg *config.StoredRequests) stored_requests.Cache { } switch { case cfg.InMemoryCache.Type == "none": - glog.Warningf("No %s cache configured. The %s Fetcher backend will be used for all data requests", cfg.DataType(), cfg.DataType()) + logger.Warnf("No %s cache configured. The %s Fetcher backend will be used for all data requests", cfg.DataType(), cfg.DataType()) case cfg.DataType() == config.AccountDataType: cache.Accounts = memory.NewCache(cfg.InMemoryCache.Size, cfg.InMemoryCache.TTL, "Accounts") default: @@ -234,10 +233,10 @@ func newHttpEvents(client *http.Client, timeout time.Duration, refreshRate time. } func newFilesystem(dataType config.DataType, configPath string) stored_requests.AllFetcher { - glog.Infof("Loading Stored %s data from filesystem at path %s", dataType, configPath) + logger.Infof("Loading Stored %s data from filesystem at path %s", dataType, configPath) fetcher, err := file_fetcher.NewFileFetcher(configPath) if err != nil { - glog.Fatalf("Failed to create a %s FileFetcher: %v", dataType, err) + logger.Fatalf("Failed to create a %s FileFetcher: %v", dataType, err) } return fetcher } @@ -247,9 +246,9 @@ func consolidate(dataType config.DataType, fetchers []stored_requests.AllFetcher if len(fetchers) == 0 { switch dataType { case config.RequestDataType: - glog.Warning("No Stored Request support configured. request.imp[i].ext.prebid.storedrequest will be ignored. If you need this, check your app config") + logger.Warnf("No Stored Request support configured. request.imp[i].ext.prebid.storedrequest will be ignored. If you need this, check your app config") default: - glog.Warningf("No Stored %s support configured. If you need this, check your app config", dataType) + logger.Warnf("No Stored %s support configured. If you need this, check your app config", dataType) } return empty_fetcher.EmptyFetcher{} } else if len(fetchers) == 1 { diff --git a/stored_requests/events/database/database.go b/stored_requests/events/database/database.go index 965922b27..1ab768c97 100644 --- a/stored_requests/events/database/database.go +++ b/stored_requests/events/database/database.go @@ -8,8 +8,8 @@ import ( "net" "time" - "github.com/golang/glog" "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/metrics" "github.com/prebid/prebid-server/v3/stored_requests/backends/db_provider" "github.com/prebid/prebid-server/v3/stored_requests/events" @@ -49,7 +49,7 @@ type DatabaseEventProducer struct { func NewDatabaseEventProducer(cfg DatabaseEventProducerConfig) (eventProducer *DatabaseEventProducer) { if cfg.Provider == nil { - glog.Fatalf("The Database Stored %s Loader needs a database connection to work.", cfg.RequestType) + logger.Fatalf("The Database Stored %s Loader needs a database connection to work.", cfg.RequestType) } return &DatabaseEventProducer{ @@ -88,7 +88,7 @@ func (e *DatabaseEventProducer) fetchAll() (fetchErr error) { e.recordFetchTime(elapsedTime, metrics.FetchAll) if err != nil { - glog.Warningf("Failed to fetch all Stored %s data from the DB: %v", e.cfg.RequestType, err) + logger.Warnf("Failed to fetch all Stored %s data from the DB: %v", e.cfg.RequestType, err) if _, ok := err.(net.Error); ok { e.recordError(metrics.StoredDataErrorNetwork) } else { @@ -99,13 +99,13 @@ func (e *DatabaseEventProducer) fetchAll() (fetchErr error) { defer func() { if err := rows.Close(); err != nil { - glog.Warningf("Failed to close the Stored %s DB connection: %v", e.cfg.RequestType, err) + logger.Warnf("Failed to close the Stored %s DB connection: %v", e.cfg.RequestType, err) e.recordError(metrics.StoredDataErrorUndefined) fetchErr = err } }() if err := e.sendEvents(rows); err != nil { - glog.Warningf("Failed to load all Stored %s data from the DB: %v", e.cfg.RequestType, err) + logger.Warnf("Failed to load all Stored %s data from the DB: %v", e.cfg.RequestType, err) e.recordError(metrics.StoredDataErrorUndefined) return err } @@ -130,7 +130,7 @@ func (e *DatabaseEventProducer) fetchDelta() (fetchErr error) { e.recordFetchTime(elapsedTime, metrics.FetchDelta) if err != nil { - glog.Warningf("Failed to fetch updated Stored %s data from the DB: %v", e.cfg.RequestType, err) + logger.Warnf("Failed to fetch updated Stored %s data from the DB: %v", e.cfg.RequestType, err) if _, ok := err.(net.Error); ok { e.recordError(metrics.StoredDataErrorNetwork) } else { @@ -141,13 +141,13 @@ func (e *DatabaseEventProducer) fetchDelta() (fetchErr error) { defer func() { if err := rows.Close(); err != nil { - glog.Warningf("Failed to close the Stored %s DB connection: %v", e.cfg.RequestType, err) + logger.Warnf("Failed to close the Stored %s DB connection: %v", e.cfg.RequestType, err) e.recordError(metrics.StoredDataErrorUndefined) fetchErr = err } }() if err := e.sendEvents(rows); err != nil { - glog.Warningf("Failed to load updated Stored %s data from the DB: %v", e.cfg.RequestType, err) + logger.Warnf("Failed to load updated Stored %s data from the DB: %v", e.cfg.RequestType, err) e.recordError(metrics.StoredDataErrorUndefined) return err } @@ -213,7 +213,7 @@ func (e *DatabaseEventProducer) sendEvents(rows *sql.Rows) (err error) { storedRespData[id] = data } default: - glog.Warningf("Stored Data with id=%s has invalid type: %s. This will be ignored.", id, dataType) + logger.Warnf("Stored Data with id=%s has invalid type: %s. This will be ignored.", id, dataType) } } diff --git a/stored_requests/events/http/http.go b/stored_requests/events/http/http.go index ec17bd077..f987afb65 100644 --- a/stored_requests/events/http/http.go +++ b/stored_requests/events/http/http.go @@ -9,13 +9,11 @@ import ( "net/url" "time" - "golang.org/x/net/context/ctxhttp" - "github.com/buger/jsonparser" + "github.com/prebid/prebid-server/v3/logger" "github.com/prebid/prebid-server/v3/stored_requests/events" "github.com/prebid/prebid-server/v3/util/jsonutil" - - "github.com/golang/glog" + "golang.org/x/net/context/ctxhttp" ) // NewHTTPEvents makes an EventProducer which creates events by pinging an external HTTP API @@ -77,7 +75,7 @@ func NewHTTPEvents(client *httpCore.Client, endpoint string, ctxProducer func() saves: make(chan events.Save, 1), invalidations: make(chan events.Invalidation, 1), } - glog.Infof("Loading HTTP cache from GET %s", endpoint) + logger.Infof("Loading HTTP cache from GET %s", endpoint) e.fetchAll() go e.refresh(time.Tick(refreshRate)) @@ -118,7 +116,7 @@ func (e *HTTPEvents) refresh(ticker <-chan time.Time) { // Error with url parsing if urlErr != nil { - glog.Errorf("Disabling refresh HTTP cache from GET '%s': %v", e.Endpoint, urlErr) + logger.Errorf("Disabling refresh HTTP cache from GET '%s': %v", e.Endpoint, urlErr) return } @@ -134,7 +132,7 @@ func (e *HTTPEvents) refresh(ticker <-chan time.Time) { // Convert to string endpoint := endpointUrl.String() - glog.Infof("Refreshing HTTP cache from GET '%s'", endpoint) + logger.Infof("Refreshing HTTP cache from GET '%s'", endpoint) ctx, cancel := e.ctxProducer() resp, err := ctxhttp.Get(ctx, e.client, endpoint) @@ -166,25 +164,25 @@ func (e *HTTPEvents) refresh(ticker <-chan time.Time) { // It returns true if everything was successful, and false if any errors occurred. func (e *HTTPEvents) parse(endpoint string, resp *httpCore.Response, err error) (*responseContract, bool) { if err != nil { - glog.Errorf("Failed call: GET %s for Stored Requests: %v", endpoint, err) + logger.Errorf("Failed call: GET %s for Stored Requests: %v", endpoint, err) return nil, false } defer resp.Body.Close() respBytes, err := io.ReadAll(resp.Body) if err != nil { - glog.Errorf("Failed to read body of GET %s for Stored Requests: %v", endpoint, err) + logger.Errorf("Failed to read body of GET %s for Stored Requests: %v", endpoint, err) return nil, false } if resp.StatusCode != httpCore.StatusOK { - glog.Errorf("Got %d response from GET %s for Stored Requests. Response body was: %s", resp.StatusCode, endpoint, string(respBytes)) + logger.Errorf("Got %d response from GET %s for Stored Requests. Response body was: %s", resp.StatusCode, endpoint, string(respBytes)) return nil, false } var respObj responseContract if err := jsonutil.UnmarshalValid(respBytes, &respObj); err != nil { - glog.Errorf("Failed to unmarshal body of GET %s for Stored Requests: %v", endpoint, err) + logger.Errorf("Failed to unmarshal body of GET %s for Stored Requests: %v", endpoint, err) return nil, false }