diff --git a/cmd/fleet/cron.go b/cmd/fleet/cron.go index e34bb08435b..54a74aa1de2 100644 --- a/cmd/fleet/cron.go +++ b/cmd/fleet/cron.go @@ -100,7 +100,7 @@ func cronVulnerabilities( return nil } - vulnPath := configureVulnPath(*config, appConfig, logger) + vulnPath := configureVulnPath(ctx, *config, appConfig, logger) if vulnPath != "" { logger.InfoContext(ctx, "scanning vulnerabilities") if err := scanVulnerabilities(ctx, ds, logger, config, appConfig, vulnPath); err != nil { diff --git a/cmd/fleet/vuln_process.go b/cmd/fleet/vuln_process.go index 7429b26c91a..69fef458b16 100644 --- a/cmd/fleet/vuln_process.go +++ b/cmd/fleet/vuln_process.go @@ -15,7 +15,6 @@ import ( "github.com/fleetdm/fleet/v4/server/datastore/mysql" "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/platform/logging" - "github.com/go-kit/log/level" "github.com/spf13/cobra" ) @@ -103,13 +102,13 @@ by an exit code of zero.`, return err } vulnConfig := cfg.Vulnerabilities - vulnPath := configureVulnPath(vulnConfig, appConfig, logger) + vulnPath := configureVulnPath(ctx, vulnConfig, appConfig, logger) // this really shouldn't ever be empty string since it's defaulted, but could be due to some misconfiguration // we'll throw an error here since the entire point of this command is to process vulnerabilities if vulnPath == "" { return errors.New("vuln path empty, check environment variables or app config yml") } - level.Info(logger).Log("msg", "scanning vulnerabilities") + logger.InfoContext(ctx, "scanning vulnerabilities") start := time.Now() vulnFuncs := getVulnFuncs(ds, logger, &vulnConfig) for _, vulnFunc := range vulnFuncs { @@ -117,7 +116,7 @@ by an exit code of zero.`, return err } } - level.Info(logger).Log("msg", "vulnerability processing finished", "took", time.Since(start)) + logger.InfoContext(ctx, "vulnerability processing finished", "took", time.Since(start)) return }, @@ -135,12 +134,11 @@ by an exit code of zero.`, return vulnProcessingCmd } -func configureVulnPath(vulnConfig config.VulnerabilitiesConfig, appConfig *fleet.AppConfig, logger *logging.Logger) (vulnPath string) { +func configureVulnPath(ctx context.Context, vulnConfig config.VulnerabilitiesConfig, appConfig *fleet.AppConfig, logger *logging.Logger) (vulnPath string) { switch { case vulnConfig.DatabasesPath != "" && appConfig != nil && appConfig.VulnerabilitySettings.DatabasesPath != "": vulnPath = vulnConfig.DatabasesPath - level.Info(logger).Log( - "msg", "fleet config takes precedence over app config when both are configured", + logger.InfoContext(ctx, "fleet config takes precedence over app config when both are configured", "databases_path", vulnPath, ) case vulnConfig.DatabasesPath != "": @@ -148,7 +146,7 @@ func configureVulnPath(vulnConfig config.VulnerabilitiesConfig, appConfig *fleet case appConfig != nil && appConfig.VulnerabilitySettings.DatabasesPath != "": vulnPath = appConfig.VulnerabilitySettings.DatabasesPath default: - level.Info(logger).Log("msg", "vulnerability scanning not configured, vulnerabilities databases path is empty") + logger.InfoContext(ctx, "vulnerability scanning not configured, vulnerabilities databases path is empty") } return vulnPath } diff --git a/ee/server/service/certificate_authorities.go b/ee/server/service/certificate_authorities.go index 612f133e7ab..f90bd8d0810 100644 --- a/ee/server/service/certificate_authorities.go +++ b/ee/server/service/certificate_authorities.go @@ -13,7 +13,6 @@ import ( "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/ptr" "github.com/fleetdm/fleet/v4/server/variables" - "github.com/go-kit/log/level" ) func (svc *Service) GetCertificateAuthority(ctx context.Context, id uint) (*fleet.CertificateAuthority, error) { @@ -231,7 +230,7 @@ func (svc *Service) validateDigicert(ctx context.Context, digicertCA *fleet.Digi } if err := svc.digiCertService.VerifyProfileID(ctx, *digicertCA); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate DigiCert profile GUID", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate DigiCert profile GUID", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sCould not verify DigiCert profile ID: %s. Please correct and try again.", errPrefix, err.Error())} } return nil @@ -375,11 +374,11 @@ func (svc *Service) validateNDESSCEPProxy(ctx context.Context, ndesSCEP *fleet.N return err } if err := svc.scepConfigService.ValidateSCEPURL(ctx, ndesSCEP.URL); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate NDES SCEP URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate NDES SCEP URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sInvalid SCEP URL. Please correct and try again.", errPrefix)} } if err := svc.scepConfigService.ValidateNDESSCEPAdminURL(ctx, *ndesSCEP); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate NDES SCEP admin URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate NDES SCEP admin URL", "err", err) switch { case errors.As(err, &NDESPasswordCacheFullError{}): return &fleet.BadRequestError{Message: fmt.Sprintf("%sThe NDES password cache is full. Please increase the number of cached passwords in NDES and try again.", errPrefix)} @@ -403,7 +402,7 @@ func (svc *Service) validateCustomSCEPProxy(ctx context.Context, customSCEP *fle return fleet.NewInvalidArgumentError("challenge", fmt.Sprintf("%sCustom SCEP Proxy challenge cannot be empty", errPrefix)) } if err := svc.scepConfigService.ValidateSCEPURL(ctx, customSCEP.URL); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate custom SCEP URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate custom SCEP URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sInvalid SCEP URL. Please correct and try again.", errPrefix)} } return nil @@ -423,11 +422,11 @@ func (svc *Service) validateSmallstepSCEPProxy(ctx context.Context, smallstepSCE return fleet.NewInvalidArgumentError("password", fmt.Sprintf("%sSmallstep password cannot be empty", errPrefix)) } if err := svc.scepConfigService.ValidateSCEPURL(ctx, smallstepSCEP.URL); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate Smallstep SCEP URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate Smallstep SCEP URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sInvalid SCEP URL. Please correct and try again.", errPrefix)} } if err := svc.scepConfigService.ValidateSmallstepChallengeURL(ctx, *smallstepSCEP); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate Smallstep SCEP admin URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate Smallstep SCEP admin URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sInvalid challenge URL or credentials. Please correct and try again.", errPrefix)} } return nil @@ -499,12 +498,12 @@ func (svc *Service) BatchApplyCertificateAuthorities(ctx context.Context, incomi } if ops == nil { - level.Debug(svc.logger).Log("msg", "batch apply certificate authorities: no certificate authority changes to apply") + svc.logger.DebugContext(ctx, "batch apply certificate authorities: no certificate authority changes to apply") return nil } if dryRun { - level.Debug(svc.logger).Log("msg", "batch apply certificate authorities: no certificate authority changes to apply") + svc.logger.DebugContext(ctx, "batch apply certificate authorities: no certificate authority changes to apply") return nil } @@ -629,19 +628,19 @@ func (svc *Service) processNDESSCEP(ctx context.Context, batchOps *fleet.Certifi if existing == nil && incoming == nil { // do nothing - level.Debug(svc.logger).Log("msg", "no existing or incoming NDES SCEP CA, skipping") + svc.logger.DebugContext(ctx, "no existing or incoming NDES SCEP CA, skipping") return nil } if existing != nil && incoming != nil && incoming.URL == existing.URL && incoming.AdminURL == existing.AdminURL && incoming.Username == existing.Username && incoming.Password == existing.Password { // all fields are identical so we can skip further validation and processing - level.Debug(svc.logger).Log("msg", "existing and incoming NDES SCEP CA are identical, skipping") + svc.logger.DebugContext(ctx, "existing and incoming NDES SCEP CA are identical, skipping") return nil } if existing != nil && (incoming == nil || (incoming.URL == "" && incoming.AdminURL == "" && incoming.Username == "" && incoming.Password == "")) { // delete current - level.Debug(svc.logger).Log("msg", "deleting existing NDES SCEP CA as incoming is empty") + svc.logger.DebugContext(ctx, "deleting existing NDES SCEP CA as incoming is empty") batchOps.Delete = append(batchOps.Delete, &fleet.CertificateAuthority{ Type: string(fleet.CATypeNDESSCEPProxy), Name: &ndesName, @@ -662,7 +661,7 @@ func (svc *Service) processNDESSCEP(ctx context.Context, batchOps *fleet.Certifi // add if there is no existing if existing == nil || (existing.URL == "" && existing.AdminURL == "" && existing.Username == "" && existing.Password == "") { - level.Debug(svc.logger).Log("msg", "adding new NDES SCEP CA as none exists") + svc.logger.DebugContext(ctx, "adding new NDES SCEP CA as none exists") batchOps.Add = append(batchOps.Add, &fleet.CertificateAuthority{ Type: string(fleet.CATypeNDESSCEPProxy), Name: &ndesName, @@ -675,7 +674,7 @@ func (svc *Service) processNDESSCEP(ctx context.Context, batchOps *fleet.Certifi } // otherwise update with existing id - level.Debug(svc.logger).Log("msg", "updating existing NDES SCEP CA") + svc.logger.DebugContext(ctx, "updating existing NDES SCEP CA") incoming.ID = existing.ID batchOps.Update = append(batchOps.Update, &fleet.CertificateAuthority{ Type: string(fleet.CATypeNDESSCEPProxy), @@ -1277,7 +1276,7 @@ func (svc *Service) validateDigicertUpdate(ctx context.Context, digicert *fleet. digicertCA.APIToken = *oldCA.APIToken } if err := svc.digiCertService.VerifyProfileID(ctx, digicertCA); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate DigiCert URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate DigiCert URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sCould not verify DigiCert URL: %s. Please correct and try again.", errPrefix, err.Error())} } } @@ -1309,7 +1308,7 @@ func (svc *Service) validateDigicertUpdate(ctx context.Context, digicert *fleet. digicertCA.APIToken = *oldCA.APIToken } if err := svc.digiCertService.VerifyProfileID(ctx, digicertCA); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate DigiCert profile GUID", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate DigiCert profile GUID", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sCould not verify DigiCert profile ID: %s. Please correct and try again.", errPrefix, err.Error())} } } @@ -1403,7 +1402,7 @@ func (svc *Service) validateNDESSCEPProxyUpdate(ctx context.Context, ndesSCEP *f return err } if err := svc.scepConfigService.ValidateSCEPURL(ctx, *ndesSCEP.URL); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate NDES SCEP URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate NDES SCEP URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sInvalid SCEP URL. Please correct and try again.", errPrefix)} } } @@ -1436,7 +1435,7 @@ func (svc *Service) validateNDESSCEPProxyUpdate(ctx context.Context, ndesSCEP *f } if err := svc.scepConfigService.ValidateNDESSCEPAdminURL(ctx, NDESProxy); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate NDES SCEP admin URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate NDES SCEP admin URL", "err", err) switch { case errors.As(err, &NDESPasswordCacheFullError{}): return &fleet.BadRequestError{Message: fmt.Sprintf("%sThe NDES password cache is full. Please increase the number of cached passwords in NDES and try again.", errPrefix)} @@ -1461,7 +1460,7 @@ func (svc *Service) validateCustomSCEPProxyUpdate(ctx context.Context, customSCE return err } if err := svc.scepConfigService.ValidateSCEPURL(ctx, *customSCEP.URL); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate custom SCEP URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate custom SCEP URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sInvalid SCEP URL. Please correct and try again.", errPrefix)} } } @@ -1485,7 +1484,7 @@ func (svc *Service) validateSmallstepSCEPProxyUpdate(ctx context.Context, smalls return err } if err := svc.scepConfigService.ValidateSCEPURL(ctx, *smallstep.URL); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate Smallstep SCEP URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate Smallstep SCEP URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sInvalid SCEP URL. Please correct and try again.", errPrefix)} } } @@ -1531,7 +1530,7 @@ func (svc *Service) validateSmallstepSCEPProxyUpdate(ctx context.Context, smalls } if err := svc.scepConfigService.ValidateSmallstepChallengeURL(ctx, smallstepSCEPProxy); err != nil { - level.Error(svc.logger).Log("msg", "Failed to validate Smallstep challenge URL", "err", err) + svc.logger.ErrorContext(ctx, "Failed to validate Smallstep challenge URL", "err", err) return &fleet.BadRequestError{Message: fmt.Sprintf("%sInvalid challenge URL or credentials. Please correct and try again.", errPrefix)} } } diff --git a/ee/server/service/condaccess/idp.go b/ee/server/service/condaccess/idp.go index 77c75b8800e..4b2fd65a1ec 100644 --- a/ee/server/service/condaccess/idp.go +++ b/ee/server/service/condaccess/idp.go @@ -607,8 +607,7 @@ func (s *idpService) buildIdentityProvider(ctx context.Context, serverURL string } ssoURL = ssoURL.JoinPath(idpSSOPath) - // Create kitlog adapter for SAML library - samlLogger := &kitlogAdapter{logger: s.logger.With("component", "saml-idp")} + samlLogger := &slogAdapter{ctx: ctx, logger: s.logger.SlogLogger().With("component", "saml-idp")} // Build IdentityProvider // Note: SessionProvider is set dynamically in serveSSO based on the authenticated device diff --git a/ee/server/service/condaccess/log_adapter.go b/ee/server/service/condaccess/log_adapter.go index 605f12560eb..fd9e847718f 100644 --- a/ee/server/service/condaccess/log_adapter.go +++ b/ee/server/service/condaccess/log_adapter.go @@ -1,55 +1,55 @@ package condaccess import ( + "context" "fmt" - - "github.com/fleetdm/fleet/v4/server/platform/logging" - "github.com/go-kit/log/level" + "log/slog" ) -// kitlogAdapter adapts to saml logger.Interface -type kitlogAdapter struct { - logger *logging.Logger +// slogAdapter adapts *slog.Logger to saml logger.Interface +type slogAdapter struct { + ctx context.Context + logger *slog.Logger } -func (k *kitlogAdapter) Printf(format string, v ...interface{}) { - level.Info(k.logger).Log("msg", fmt.Sprintf(format, v...)) +func (k *slogAdapter) Printf(format string, v ...any) { + k.logger.InfoContext(k.ctx, fmt.Sprintf(format, v...)) } -func (k *kitlogAdapter) Print(v ...interface{}) { - level.Info(k.logger).Log("msg", fmt.Sprint(v...)) +func (k *slogAdapter) Print(v ...any) { + k.logger.InfoContext(k.ctx, fmt.Sprint(v...)) } -func (k *kitlogAdapter) Println(v ...interface{}) { - level.Info(k.logger).Log("msg", fmt.Sprint(v...)) +func (k *slogAdapter) Println(v ...any) { + k.logger.InfoContext(k.ctx, fmt.Sprint(v...)) } -func (k *kitlogAdapter) Fatal(v ...interface{}) { - level.Error(k.logger).Log("msg", fmt.Sprint(v...)) +func (k *slogAdapter) Fatal(v ...any) { + k.logger.ErrorContext(k.ctx, fmt.Sprint(v...)) } -func (k *kitlogAdapter) Fatalf(format string, v ...interface{}) { - level.Error(k.logger).Log("msg", fmt.Sprintf(format, v...)) +func (k *slogAdapter) Fatalf(format string, v ...any) { + k.logger.ErrorContext(k.ctx, fmt.Sprintf(format, v...)) } -func (k *kitlogAdapter) Fatalln(v ...interface{}) { - level.Error(k.logger).Log("msg", fmt.Sprint(v...)) +func (k *slogAdapter) Fatalln(v ...any) { + k.logger.ErrorContext(k.ctx, fmt.Sprint(v...)) } -func (k *kitlogAdapter) Panic(v ...interface{}) { +func (k *slogAdapter) Panic(v ...any) { msg := fmt.Sprint(v...) - level.Error(k.logger).Log("msg", msg) + k.logger.ErrorContext(k.ctx, msg) panic(msg) } -func (k *kitlogAdapter) Panicf(format string, v ...interface{}) { +func (k *slogAdapter) Panicf(format string, v ...any) { msg := fmt.Sprintf(format, v...) - level.Error(k.logger).Log("msg", msg) + k.logger.ErrorContext(k.ctx, msg) panic(msg) } -func (k *kitlogAdapter) Panicln(v ...interface{}) { +func (k *slogAdapter) Panicln(v ...any) { msg := fmt.Sprint(v...) - level.Error(k.logger).Log("msg", msg) + k.logger.ErrorContext(k.ctx, msg) panic(msg) } diff --git a/ee/server/service/devices.go b/ee/server/service/devices.go index 5e760dfc5d9..a15af934357 100644 --- a/ee/server/service/devices.go +++ b/ee/server/service/devices.go @@ -12,7 +12,6 @@ import ( "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" hostctx "github.com/fleetdm/fleet/v4/server/contexts/host" "github.com/fleetdm/fleet/v4/server/fleet" - "github.com/go-kit/log/level" ) func (svc *Service) ListDevicePolicies(ctx context.Context, host *fleet.Host) ([]*fleet.HostPolicy, error) { @@ -24,7 +23,7 @@ func (svc *Service) ListDevicePolicies(ctx context.Context, host *fleet.Host) ([ // the server/webhooks one because it is a Fleet Premium only feature and for // licensing reasons this needs to live under this package. func (svc *Service) TriggerMigrateMDMDevice(ctx context.Context, host *fleet.Host) error { - level.Debug(svc.logger).Log("msg", "trigger migration webhook", "host_id", host.ID, + svc.logger.DebugContext(ctx, "trigger migration webhook", "host_id", host.ID, "refetch_critical_queries_until", host.RefetchCriticalQueriesUntil) ac, err := svc.ds.AppConfig(ctx) @@ -39,7 +38,7 @@ func (svc *Service) TriggerMigrateMDMDevice(ctx context.Context, host *fleet.Hos // the webhook has already been triggered successfully recently (within the // refetch critical queries delay), so return as if it did send it successfully // but do not re-send. - level.Debug(svc.logger).Log("msg", "waiting for critical queries refetch, skip sending webhook", + svc.logger.DebugContext(ctx, "waiting for critical queries refetch, skip sending webhook", "host_id", host.ID) return nil } diff --git a/ee/server/service/hosts.go b/ee/server/service/hosts.go index bc5ee0ae8fa..cf459c04396 100644 --- a/ee/server/service/hosts.go +++ b/ee/server/service/hosts.go @@ -11,7 +11,6 @@ import ( "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" "github.com/fleetdm/fleet/v4/server/contexts/viewer" "github.com/fleetdm/fleet/v4/server/fleet" - "github.com/go-kit/log/level" "github.com/google/uuid" ) @@ -499,7 +498,7 @@ func (svc *Service) enqueueWipeHostRequest( wipeType := fleet.MDMWindowsWipeTypeDoWipeProtected if metadata != nil && metadata.Windows != nil { wipeType = metadata.Windows.WipeType - level.Debug(svc.logger).Log("msg", "Windows host wipe request", "wipe_type", wipeType.String()) + svc.logger.DebugContext(ctx, "Windows host wipe request", "wipe_type", wipeType.String()) } wipeCmdUUID := uuid.NewString() wipeCmd := &fleet.MDMWindowsCommand{ diff --git a/ee/server/service/in_house_apps.go b/ee/server/service/in_house_apps.go index c240023b1c2..610b8ff0214 100644 --- a/ee/server/service/in_house_apps.go +++ b/ee/server/service/in_house_apps.go @@ -12,7 +12,6 @@ import ( "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/mdm/apple/mobileconfig" "github.com/fleetdm/fleet/v4/server/ptr" - "github.com/go-kit/log/level" ) func (svc *Service) updateInHouseAppInstaller(ctx context.Context, payload *fleet.UpdateSoftwareInstallerPayload, vc viewer.Viewer, teamName *string, software *fleet.SoftwareTitle) (*fleet.SoftwareInstaller, error) { @@ -178,7 +177,7 @@ func (svc *Service) GetInHouseAppManifest(ctx context.Context, titleID uint, tea signedURL, err := svc.softwareInstallStore.Sign(ctx, meta.StorageID, fleet.InHouseAppSignedURLExpiry) if err != nil { // We log the error and continue to send the Fleet server URL for the in-house app - level.Error(svc.logger).Log("msg", "error signing in-house app URL; check CloudFront configuration", "err", err) + svc.logger.ErrorContext(ctx, "error signing in-house app URL; check CloudFront configuration", "err", err) } else { downloadURL = signedURL } diff --git a/ee/server/service/request_certificate.go b/ee/server/service/request_certificate.go index 88f4d03c6c2..308d629ea2b 100644 --- a/ee/server/service/request_certificate.go +++ b/ee/server/service/request_certificate.go @@ -17,7 +17,6 @@ import ( "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/ptr" - "github.com/go-kit/log/level" ) // This code largely adapted from fleet/website/api/controllers/get-est-device-certificate.js @@ -59,7 +58,7 @@ func (svc *Service) RequestCertificate(ctx context.Context, p fleet.RequestCerti } certificateRequest, err := svc.parseCSR(ctx, p.CSR) if err != nil { - level.Error(svc.logger).Log("msg", "Failed to parse CSR during certificate request", "err", err) + svc.logger.ErrorContext(ctx, "Failed to parse CSR during certificate request", "err", err) return nil, InvalidCSRError{} } @@ -71,22 +70,22 @@ func (svc *Service) RequestCertificate(ctx context.Context, p fleet.RequestCerti csrEmail, csrUsername, err := svc.extractCSRUserInfo(ctx, certificateRequest) if err != nil { - level.Error(svc.logger).Log("msg", "CSR did not have expected format for IDP verification", "err", err) + svc.logger.ErrorContext(ctx, "CSR did not have expected format for IDP verification", "err", err) return nil, InvalidCSRError{} } introspectionResponse, err := svc.introspectIDPToken(ctx, *p.IDPClientID, *p.IDPToken, *p.IDPOauthURL) if err != nil { - level.Error(svc.logger).Log("msg", "Failed to introspect IDP token during certificate request", "idp_url", *p.IDPOauthURL, "err", err) + svc.logger.ErrorContext(ctx, "Failed to introspect IDP token during certificate request", "idp_url", *p.IDPOauthURL, "err", err) return nil, InvalidIDPTokenError{} } if !introspectionResponse.Active { - level.Error(svc.logger).Log("msg", "Failing Certificate Request due to inactive IDP token", "idp_url", *p.IDPOauthURL) + svc.logger.ErrorContext(ctx, "Failing Certificate Request due to inactive IDP token", "idp_url", *p.IDPOauthURL) return nil, InvalidIDPTokenError{} } // This field is technically optional in the spec though its omittance may indicate an incompatible IDP or setup if introspectionResponse.Username == nil || len(*introspectionResponse.Username) == 0 { - level.Error(svc.logger).Log("msg", "Failing Certificate Request due to missing username in IDP token introspection response") + svc.logger.ErrorContext(ctx, "Failing Certificate Request due to missing username in IDP token introspection response") return nil, InvalidIDPTokenError{} } @@ -95,11 +94,11 @@ func (svc *Service) RequestCertificate(ctx context.Context, p fleet.RequestCerti // the email should either equal the username or include it as a prefix, i.e. // email=username@example.com and username=username if !strings.HasPrefix(csrEmail, csrUsername) { - level.Error(svc.logger).Log("msg", "Failing Certificate Request due to mismatch between CSR email and UPN", "csr_email", csrEmail, "csr_upn", csrUsername) + svc.logger.ErrorContext(ctx, "Failing Certificate Request due to mismatch between CSR email and UPN", "csr_email", csrEmail, "csr_upn", csrUsername) return nil, InvalidCSRError{} } if csrEmail != *introspectionResponse.Username { - level.Error(svc.logger).Log("msg", "Failing Certificate Request due to mismatch between CSR email and IDP token username", "csr_email", csrEmail, "idp_username", *introspectionResponse.Username) + svc.logger.ErrorContext(ctx, "Failing Certificate Request due to mismatch between CSR email and IDP token username", "csr_email", csrEmail, "idp_username", *introspectionResponse.Username) // The email in the CSR must match the username from the IDP token introspection return nil, InvalidIDPTokenError{} } @@ -128,14 +127,14 @@ func (svc *Service) RequestCertificate(ctx context.Context, p fleet.RequestCerti certificate, err := svc.estService.GetCertificate(ctx, estCA, csrForRequest) if err != nil { - level.Error(svc.logger).Log("msg", "EST certificate request failed", "ca_id", ca.ID, "error", err) + svc.logger.ErrorContext(ctx, "EST certificate request failed", "ca_id", ca.ID, "err", err) // Bad request may seem like a strange error here but there are many cases where a malformed // CSR can cause this error and Hydrant's API often returns a 5XX error even in these cases // so it is not always possible to distinguish between an error caused by a bad request or // an internal CA error. return nil, &fleet.BadRequestError{Message: fmt.Sprintf("EST certificate request failed: %s", err.Error())} } - level.Info(svc.logger).Log("msg", "Successfully retrieved a certificate from EST", "ca_id", ca.ID, "idp_username", idpUsername) + svc.logger.InfoContext(ctx, "Successfully retrieved a certificate from EST", "ca_id", ca.ID, "idp_username", idpUsername) // Wrap the certificate in a PEM block for easier consumption by the client return ptr.String("-----BEGIN CERTIFICATE-----\n" + string(certificate.Certificate) + "\n-----END CERTIFICATE-----\n"), nil } diff --git a/ee/server/service/setup_experience.go b/ee/server/service/setup_experience.go index a103fb90cd5..bad0991e9bd 100644 --- a/ee/server/service/setup_experience.go +++ b/ee/server/service/setup_experience.go @@ -11,7 +11,6 @@ import ( "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/ptr" - "github.com/go-kit/log/level" ) func (svc *Service) SetSetupExperienceSoftware(ctx context.Context, platform string, teamID uint, titleIDs []uint) error { @@ -275,7 +274,7 @@ func (svc *Service) SetupExperienceNextStep(ctx context.Context, host *fleet.Hos // if we get an error (e.g. no available licenses) while attempting to enqueue the // install, then we should immediately go to an error state so setup experience // isn't blocked. - level.Warn(svc.logger).Log("msg", "got an error when attempting to enqueue VPP app install", "err", err, "adam_id", app.VPPAppAdamID) + svc.logger.WarnContext(ctx, "got an error when attempting to enqueue VPP app install", "err", err, "adam_id", app.VPPAppAdamID) app.Status = fleet.SetupExperienceStatusFailure app.Error = ptr.String(err.Error()) // At this point we need to check whether the "cancel if software install fails" setting is active, diff --git a/ee/server/service/vpp.go b/ee/server/service/vpp.go index 4dade341efb..3dd2c8f616d 100644 --- a/ee/server/service/vpp.go +++ b/ee/server/service/vpp.go @@ -22,7 +22,6 @@ import ( "github.com/fleetdm/fleet/v4/server/mdm/apple/vpp" "github.com/fleetdm/fleet/v4/server/ptr" "github.com/fleetdm/fleet/v4/server/worker" - "github.com/go-kit/log/level" ) // Used for overriding the env var value in testing @@ -381,7 +380,7 @@ func (svc *Service) BatchAssociateVPPApps(ctx context.Context, teamName string, } titleID, ok := appStoreIDToTitleID[app.VPPAppID.String()] if !ok { - level.Error(svc.logger).Log("msg", "software title missing for vpp app", "vpp_app_id", app.VPPAppID.String()) + svc.logger.ErrorContext(ctx, "software title missing for vpp app", "vpp_app_id", app.VPPAppID.String()) continue } @@ -769,7 +768,7 @@ func (svc *Service) AddAppStoreApp(ctx context.Context, teamID *uint, appID flee } if err := svc.NewActivity(ctx, authz.UserFromContext(ctx), policyAct); err != nil { - level.Warn(svc.logger).Log("msg", "failed to create activity for create automatic install policy for app store app", "err", err) + svc.logger.WarnContext(ctx, "failed to create activity for create automatic install policy for app store app", "err", err) } } diff --git a/server/logging/nanodep.go b/server/logging/nanodep.go index dfe4ea030d9..a178b3441a6 100644 --- a/server/logging/nanodep.go +++ b/server/logging/nanodep.go @@ -1,32 +1,36 @@ package logging import ( + "context" + "log/slog" + nanodep_log "github.com/fleetdm/fleet/v4/server/mdm/nanodep/log" - "github.com/fleetdm/fleet/v4/server/platform/logging" - "github.com/go-kit/log/level" ) // NanoDEPLogger is a logger adapter for nanodep. type NanoDEPLogger struct { - logger *logging.Logger + ctx context.Context + logger *slog.Logger } -func NewNanoDEPLogger(logger *logging.Logger) *NanoDEPLogger { +func NewNanoDEPLogger(ctx context.Context, logger *slog.Logger) *NanoDEPLogger { return &NanoDEPLogger{ + ctx: ctx, logger: logger, } } -func (l *NanoDEPLogger) Info(keyvals ...interface{}) { - level.Info(l.logger).Log(keyvals...) +func (l *NanoDEPLogger) Info(keyvals ...any) { + l.logger.InfoContext(l.ctx, "", keyvals...) } -func (l *NanoDEPLogger) Debug(keyvals ...interface{}) { - level.Debug(l.logger).Log(keyvals...) +func (l *NanoDEPLogger) Debug(keyvals ...any) { + l.logger.DebugContext(l.ctx, "", keyvals...) } -func (l *NanoDEPLogger) With(keyvals ...interface{}) nanodep_log.Logger { +func (l *NanoDEPLogger) With(keyvals ...any) nanodep_log.Logger { return &NanoDEPLogger{ + ctx: l.ctx, logger: l.logger.With(keyvals...), } } diff --git a/server/mdm/apple/apple_mdm.go b/server/mdm/apple/apple_mdm.go index 77d6870893e..41d1fb2476d 100644 --- a/server/mdm/apple/apple_mdm.go +++ b/server/mdm/apple/apple_mdm.go @@ -28,7 +28,6 @@ import ( depclient "github.com/fleetdm/fleet/v4/server/mdm/nanodep/client" nanodep_storage "github.com/fleetdm/fleet/v4/server/mdm/nanodep/storage" depsync "github.com/fleetdm/fleet/v4/server/mdm/nanodep/sync" - platformlogging "github.com/fleetdm/fleet/v4/server/platform/logging" ) const ( @@ -443,7 +442,7 @@ func (d *DEPService) EnsureCustomSetupAssistantIfExists(ctx context.Context, tea } func (d *DEPService) RunAssigner(ctx context.Context) error { - syncerLogger := logging.NewNanoDEPLogger(platformlogging.NewLogger(d.logger.With("component", "nanodep-syncer"))) + syncerLogger := logging.NewNanoDEPLogger(ctx, d.logger.With("component", "nanodep-syncer")) teams, err := d.ds.ListTeams( ctx, fleet.TeamFilter{ User: &fleet.User{ diff --git a/server/service/appconfig.go b/server/service/appconfig.go index 8a7dd093d05..76d933edf89 100644 --- a/server/service/appconfig.go +++ b/server/service/appconfig.go @@ -30,7 +30,6 @@ import ( "github.com/fleetdm/fleet/v4/server/platform/endpointer" "github.com/fleetdm/fleet/v4/server/platform/logging" "github.com/fleetdm/fleet/v4/server/version" - "github.com/go-kit/log/level" "golang.org/x/text/unicode/norm" ) @@ -343,7 +342,7 @@ func (svc *Service) ModifyAppConfig(ctx context.Context, p []byte, applyOpts fle // SMTPSettings used to be a non-pointer on previous iterations, // so if current SMTPSettings are not present (with empty values), // then this is a bug, let's log an error. - level.Error(svc.logger).Log("msg", "smtp_settings are not present") + svc.logger.ErrorContext(ctx, "smtp_settings are not present") } oldAgentOptions := "" @@ -537,7 +536,7 @@ func (svc *Service) ModifyAppConfig(ctx context.Context, p []byte, applyOpts fle err = fleet.SuggestAgentOptionsCorrection(err) err = fleet.NewUserMessageError(err, http.StatusBadRequest) if applyOpts.Force && !applyOpts.DryRun { - level.Info(svc.logger).Log("err", err, "msg", "force-apply appConfig agent options with validation errors") + svc.logger.InfoContext(ctx, "force-apply appConfig agent options with validation errors", "err", err) } if !applyOpts.Force { return nil, ctxerr.Wrap(ctx, err, "validate agent options") diff --git a/server/service/conditional_access_microsoft.go b/server/service/conditional_access_microsoft.go index 691b296a7a3..15caf6a09bf 100644 --- a/server/service/conditional_access_microsoft.go +++ b/server/service/conditional_access_microsoft.go @@ -7,7 +7,6 @@ import ( "github.com/fleetdm/fleet/v4/server/authz" "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" "github.com/fleetdm/fleet/v4/server/fleet" - "github.com/go-kit/log/level" ) type conditionalAccessMicrosoftCreateRequest struct { @@ -133,14 +132,14 @@ func (svc *Service) ConditionalAccessMicrosoftConfirm(ctx context.Context) (conf getResponse, err := svc.conditionalAccessMicrosoftProxy.Get(ctx, integration.TenantID, integration.ProxyServerSecret) if err != nil { - level.Error(svc.logger).Log("msg", "failed to get integration settings from proxy", "err", err) + svc.logger.ErrorContext(ctx, "failed to get integration settings from proxy", "err", err) return false, "", nil } if !getResponse.SetupDone { var setupError string if getResponse.SetupError != nil { - level.Error(svc.logger).Log("msg", "setup is not done", "setup_error", getResponse.SetupError) + svc.logger.ErrorContext(ctx, "setup is not done", "setup_error", getResponse.SetupError) setupError = *getResponse.SetupError } return false, setupError, nil diff --git a/server/service/devices.go b/server/service/devices.go index c2b7a5f2697..0f7bcf98a10 100644 --- a/server/service/devices.go +++ b/server/service/devices.go @@ -18,7 +18,6 @@ import ( hostctx "github.com/fleetdm/fleet/v4/server/contexts/host" "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/ptr" - "github.com/go-kit/log/level" ) ///////////////////////////////////////////////////////////////////////////////// @@ -788,12 +787,7 @@ func (svc *Service) LogFleetdError(ctx context.Context, fleetdError fleet.Fleetd } err := ctxerr.WrapWithData(ctx, fleetdError, "receive fleetd error", fleetdError.ToMap()) - level.Warn(svc.logger).Log( - "msg", - "fleetd error", - "error", - err, - ) + svc.logger.WarnContext(ctx, "fleetd error", "error", err) // Send to Redis/telemetry (if enabled) ctxerr.Handle(ctx, err) diff --git a/server/service/handler.go b/server/service/handler.go index a5cfda14205..86659c96bff 100644 --- a/server/service/handler.go +++ b/server/service/handler.go @@ -39,7 +39,6 @@ import ( "github.com/docker/go-units" "github.com/fleetdm/fleet/v4/server/platform/logging" kithttp "github.com/go-kit/kit/transport/http" - "github.com/go-kit/log/level" "github.com/gorilla/mux" "github.com/klauspost/compress/gzhttp" nanomdm_log "github.com/micromdm/nanolib/log" @@ -1306,11 +1305,11 @@ func NewNanoMDMLogger(logger *logging.Logger) *NanoMDMLogger { } func (l *NanoMDMLogger) Info(keyvals ...interface{}) { - level.Info(l.logger).Log(keyvals...) + l.logger.InfoContext(context.TODO(), "", keyvals...) } func (l *NanoMDMLogger) Debug(keyvals ...interface{}) { - level.Debug(l.logger).Log(keyvals...) + l.logger.DebugContext(context.TODO(), "", keyvals...) } func (l *NanoMDMLogger) With(keyvals ...interface{}) nanomdm_log.Logger { @@ -1352,7 +1351,7 @@ func registerMDM( var mdmHandler http.Handler = httpmdm.CheckinAndCommandHandler(mdmService, mdmLogger.With("handler", "checkin-command")) verifyDisable, exists := os.LookupEnv("FLEET_MDM_APPLE_SCEP_VERIFY_DISABLE") if exists && (strings.EqualFold(verifyDisable, "true") || verifyDisable == "1") { - level.Info(logger).Log("msg", + logger.InfoContext(context.TODO(), "disabling verification of macOS SCEP certificates as FLEET_MDM_APPLE_SCEP_VERIFY_DISABLE is set to true") } else { mdmHandler = httpmdm.CertVerifyMiddleware(mdmHandler, certVerifier, mdmLogger.With("handler", "cert-verify")) @@ -1377,7 +1376,7 @@ func WithMDMEnrollmentMiddleware(svc fleet.Service, logger *logging.Logger, next parsed, err := apple_mdm.ParseDeviceinfo(di, false) // FIXME: use verify=true when we have better parsing for various Apple certs (https://github.com/fleetdm/fleet/issues/20879) if err != nil { // just log the error and continue to next - level.Error(logger).Log("msg", "parsing x-apple-aspen-deviceinfo", "err", err) + logger.ErrorContext(r.Context(), "parsing x-apple-aspen-deviceinfo", "err", err) next.ServeHTTP(w, r) return } @@ -1388,7 +1387,7 @@ func WithMDMEnrollmentMiddleware(svc fleet.Service, logger *logging.Logger, next sur, err := svc.CheckMDMAppleEnrollmentWithMinimumOSVersion(r.Context(), parsed) if err != nil { // just log the error and continue to next - level.Error(logger).Log("msg", "checking minimum os version for mdm", "err", err) + logger.ErrorContext(r.Context(), "checking minimum os version for mdm", "err", err) next.ServeHTTP(w, r) return } @@ -1397,7 +1396,7 @@ func WithMDMEnrollmentMiddleware(svc fleet.Service, logger *logging.Logger, next w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusForbidden) if err := json.NewEncoder(w).Encode(sur); err != nil { - level.Error(logger).Log("msg", "failed to encode software update required", "err", err) + logger.ErrorContext(r.Context(), "failed to encode software update required", "err", err) http.Redirect(w, r, r.URL.String()+"?error=true", http.StatusSeeOther) } return @@ -1420,16 +1419,16 @@ func WithMDMEnrollmentMiddleware(svc fleet.Service, logger *logging.Logger, next newURL := *r.URL q.Set("deviceinfo", di) newURL.RawQuery = q.Encode() - level.Info(logger).Log("msg", "handling mdm sso: redirect with deviceinfo", "host_uuid", parsed.UDID, "serial", parsed.Serial) + logger.InfoContext(r.Context(), "handling mdm sso: redirect with deviceinfo", "host_uuid", parsed.UDID, "serial", parsed.Serial) http.Redirect(w, r, newURL.String(), http.StatusTemporaryRedirect) return } if len(v) > 0 && v[0] != di { // something is wrong, the device info in the query params does not match // the one in the header, so we just log the error and continue to next - level.Error(logger).Log("msg", "device info in query params does not match header", "header", di, "query", v[0]) + logger.ErrorContext(r.Context(), "device info in query params does not match header", "header", di, "query", v[0]) } - level.Info(logger).Log("msg", "handling mdm sso: proceed to next", "host_uuid", parsed.UDID, "serial", parsed.Serial) + logger.InfoContext(r.Context(), "handling mdm sso: proceed to next", "host_uuid", parsed.UDID, "serial", parsed.Serial) } next.ServeHTTP(w, r) diff --git a/server/service/hosts.go b/server/service/hosts.go index bbc657ef189..8d5256f9705 100644 --- a/server/service/hosts.go +++ b/server/service/hosts.go @@ -34,7 +34,6 @@ import ( mdmlifecycle "github.com/fleetdm/fleet/v4/server/mdm/lifecycle" "github.com/fleetdm/fleet/v4/server/ptr" "github.com/fleetdm/fleet/v4/server/worker" - "github.com/go-kit/log/level" "github.com/gocarina/gocsv" "github.com/google/uuid" ) @@ -1652,7 +1651,7 @@ func (svc *Service) getHostDetails(ctx context.Context, host *fleet.Host, opts f switch { case err != nil && fleet.IsNotFound(err): // assume host is unmanaged, log for debugging, and move on - level.Debug(svc.logger).Log("msg", "cannot determine bitlocker status because no mdm info for host", "host_id", host.ID) + svc.logger.DebugContext(ctx, "cannot determine bitlocker status because no mdm info for host", "host_id", host.ID) case err != nil: return nil, ctxerr.Wrap(ctx, err, "ensure host mdm info") default: @@ -2093,13 +2092,13 @@ func (svc *Service) SetHostDeviceMapping(ctx context.Context, hostID uint, email // This enables fields like idp_full_name, idp_groups, etc. to appear in the API if err := svc.ds.SetOrUpdateHostSCIMUserMapping(ctx, hostID, scimUser.ID); err != nil { // Log the error but don't fail the request since the main IDP mapping succeeded - level.Debug(svc.logger).Log("msg", "failed to set SCIM user mapping", "err", err) + svc.logger.DebugContext(ctx, "failed to set SCIM user mapping", "err", err) } } else { // User doesn't exist in SCIM, remove any existing SCIM mapping for this host if err := svc.ds.DeleteHostSCIMUserMapping(ctx, hostID); err != nil && !fleet.IsNotFound(err) { // Log the error but don't fail the request - level.Debug(svc.logger).Log("msg", "failed to delete SCIM user mapping", "err", err) + svc.logger.DebugContext(ctx, "failed to delete SCIM user mapping", "err", err) } } @@ -2955,7 +2954,7 @@ func (svc *Service) HostEncryptionKey(ctx context.Context, id uint) (*fleet.Host return nil, err } - level.Info(svc.logger).Log("msg", "retrieving host disk encryption key", "host_id", host.ID, "host_name", host.DisplayName()) + svc.logger.InfoContext(ctx, "retrieving host disk encryption key", "host_id", host.ID, "host_name", host.DisplayName()) key, err := svc.getHostDiskEncryptionKey(ctx, host) if err != nil { return nil, ctxerr.Wrap(ctx, err, "getting host encryption key") @@ -3042,7 +3041,7 @@ func (svc *Service) getHostDiskEncryptionKey(ctx context.Context, host *fleet.Ho case decrypted == "": decryptErrs = append(decryptErrs, fmt.Errorf("decrypted host disk encryption key is empty for host %d", host.ID)) default: - level.Info(svc.logger).Log("msg", "decrypted current host disk encryption key", "host_id", host.ID) + svc.logger.InfoContext(ctx, "decrypted current host disk encryption key", "host_id", host.ID) key.Decryptable = ptr.Bool(true) key.DecryptedValue = decrypted @@ -3059,7 +3058,7 @@ func (svc *Service) getHostDiskEncryptionKey(ctx context.Context, host *fleet.Ho case decrypted == "": decryptErrs = append(decryptErrs, fmt.Errorf("decrypted archived disk encryption key is empty for host %d", host.ID)) default: - level.Info(svc.logger).Log("msg", "decrypted archived host disk encryption key", "host_id", host.ID) + svc.logger.InfoContext(ctx, "decrypted archived host disk encryption key", "host_id", host.ID) // We successfully decrypted the archived key so we'll use it in place of the current key. key = &fleet.HostDiskEncryptionKey{ @@ -3076,7 +3075,7 @@ func (svc *Service) getHostDiskEncryptionKey(ctx context.Context, host *fleet.Ho if len(decryptErrs) > 0 { // If we have any decryption errors, log them. - level.Error(svc.logger).Log("msg", "decryption errors for host disk encryption key", "host_id", host.ID, "errors", errors.Join(decryptErrs...)) + svc.logger.ErrorContext(ctx, "decryption errors for host disk encryption key", "host_id", host.ID, "errors", errors.Join(decryptErrs...)) } if key == nil || key.DecryptedValue == "" { diff --git a/server/service/live_queries.go b/server/service/live_queries.go index ccf84539979..8f67cab1131 100644 --- a/server/service/live_queries.go +++ b/server/service/live_queries.go @@ -15,7 +15,6 @@ import ( "github.com/fleetdm/fleet/v4/server/contexts/logging" "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/ptr" - "github.com/go-kit/log/level" ) type runLiveQueryRequest struct { @@ -265,8 +264,7 @@ func (svc *Service) RunLiveQueryDeadline( campaign, err := svc.NewDistributedQueryCampaign(ctx, queryString, queryIDPtr, fleet.HostTargets{HostIDs: hostIDs}) if err != nil { - level.Error(svc.logger).Log( - "msg", "new distributed query campaign", + svc.logger.ErrorContext(ctx, "new distributed query campaign", "queryString", queryString, "queryID", queryID, "err", err, @@ -283,8 +281,8 @@ func (svc *Service) RunLiveQueryDeadline( defer func() { err := svc.CompleteCampaign(ctxWithoutCancel, campaign) if err != nil { - level.Error(svc.logger).Log( - "msg", "completing campaign (sync)", "query.id", campaign.QueryID, "campaign.id", campaign.ID, "err", err, + svc.logger.ErrorContext(ctxWithoutCancel, "completing campaign (sync)", + "query.id", campaign.QueryID, "campaign.id", campaign.ID, "err", err, ) resultsCh <- fleet.QueryCampaignResult{ QueryID: queryID, @@ -296,8 +294,8 @@ func (svc *Service) RunLiveQueryDeadline( readChan, cancelFunc, err := svc.GetCampaignReader(ctx, campaign) if err != nil { - level.Error(svc.logger).Log( - "msg", "get campaign reader", "query.id", campaign.QueryID, "campaign.id", campaign.ID, "err", err, + svc.logger.ErrorContext(ctx, "get campaign reader", + "query.id", campaign.QueryID, "campaign.id", campaign.ID, "err", err, ) resultsCh <- fleet.QueryCampaignResult{QueryID: queryID, Error: ptr.String(err.Error()), Err: err} return @@ -314,7 +312,7 @@ func (svc *Service) RunLiveQueryDeadline( perfStatsTracker := statsTracker{} perfStatsTracker.saveStats, err = svc.ds.IsSavedQuery(ctx, campaign.QueryID) if err != nil { - level.Error(svc.logger).Log("msg", "error checking saved query", "query.id", campaign.QueryID, "err", err) + svc.logger.ErrorContext(ctx, "error checking saved query", "query.id", campaign.QueryID, "err", err) perfStatsTracker.saveStats = false } totalHosts := campaign.Metrics.TotalHosts diff --git a/server/service/orbit.go b/server/service/orbit.go index 0fc627620f8..d7d94169236 100644 --- a/server/service/orbit.go +++ b/server/service/orbit.go @@ -27,7 +27,6 @@ import ( "github.com/fleetdm/fleet/v4/server/service/contract" "github.com/fleetdm/fleet/v4/server/service/osquery_utils" "github.com/fleetdm/fleet/v4/server/worker" - "github.com/go-kit/log/level" ) type setOrbitNodeKeyer interface { @@ -230,9 +229,9 @@ func (svc *Service) EnrollOrbit(ctx context.Context, hostInfo fleet.OrbitHostInf mp, ok := capabilities.FromContext(ctx) //nolint:gocritic // ignore ifElseChain if !ok { - level.Error(svc.logger).Log("msg", "!!! ERR_ALLOWING_UNAUTHENTICATED: host is not authenticated, but fleet could not determine whether orbit supports end-user authentication. proceeding with enrollment. !!! ", "host_uuid", hostInfo.HardwareUUID) + svc.logger.ErrorContext(ctx, "!!! ERR_ALLOWING_UNAUTHENTICATED: host is not authenticated, but fleet could not determine whether orbit supports end-user authentication. proceeding with enrollment. !!! ", "host_uuid", hostInfo.HardwareUUID) } else if !mp.Has(fleet.CapabilityEndUserAuth) { - level.Warn(svc.logger).Log("msg", "!!! ERR_ALLOWING_UNAUTHENTICATED: host is not authenticated, but connected with an orbit version that does not support end user authentication. proceeding with enrollment. !!! ", "host_uuid", hostInfo.HardwareUUID) + svc.logger.WarnContext(ctx, "!!! ERR_ALLOWING_UNAUTHENTICATED: host is not authenticated, but connected with an orbit version that does not support end user authentication. proceeding with enrollment. !!! ", "host_uuid", hostInfo.HardwareUUID) } else { // Otherwise report the unauthenticated host and let Orbit handle it (e.g. by prompting the user to authenticate). return "", fleet.NewOrbitIDPAuthRequiredError() @@ -250,7 +249,7 @@ func (svc *Service) EnrollOrbit(ctx context.Context, hostInfo fleet.OrbitHostInf if err != nil { // Log error but continue enrollment (fail-open approach). If Redis is unavailable, // enrollment proceeds without sticky behavior rather than blocking. - level.Error(svc.logger).Log("msg", "failed to get sticky enrollment", "err", err, "host_uuid", hostInfo.HardwareUUID) + svc.logger.ErrorContext(ctx, "failed to get sticky enrollment", "err", err, "host_uuid", hostInfo.HardwareUUID) } } @@ -271,9 +270,9 @@ func (svc *Service) EnrollOrbit(ctx context.Context, hostInfo fleet.OrbitHostInf // are associated during MDM enrollment. platform := host.FleetPlatform() if platform == "linux" || platform == "windows" { - level.Debug(svc.logger).Log("msg", "attempting to associate enrolled host with SCIM user", "host_id", host.ID, "platform", platform) + svc.logger.DebugContext(ctx, "attempting to associate enrolled host with SCIM user", "host_id", host.ID, "platform", platform) if err := svc.ds.MaybeAssociateHostWithScimUser(ctx, host.ID); err != nil { - level.Error(svc.logger).Log("msg", "failed to associate enrolled host with SCIM user", "err", err, "host_id", host.ID) + svc.logger.ErrorContext(ctx, "failed to associate enrolled host with SCIM user", "err", err, "host_id", host.ID) } } @@ -286,7 +285,7 @@ func (svc *Service) EnrollOrbit(ctx context.Context, hostInfo fleet.OrbitHostInf HostDisplayName: host.DisplayName(), }, ); err != nil { - level.Error(svc.logger).Log("msg", "record fleet enroll activity", "err", err) + svc.logger.ErrorContext(ctx, "record fleet enroll activity", "err", err) } return orbitNodeKey, nil @@ -364,7 +363,7 @@ func (svc *Service) GetOrbitConfig(ctx context.Context) (fleet.OrbitConfig, erro // the device. mp, ok := capabilities.FromContext(ctx) if !ok || !mp.Has(fleet.CapabilitySetupExperience) { - level.Debug(svc.logger).Log("msg", "host doesn't support setup experience, falling back to worker-based device release", "host_uuid", host.UUID) + svc.logger.DebugContext(ctx, "host doesn't support setup experience, falling back to worker-based device release", "host_uuid", host.UUID) if err := svc.processReleaseDeviceForOldFleetd(ctx, host); err != nil { return fleet.OrbitConfig{}, err } @@ -686,12 +685,12 @@ func (svc *Service) setDiskEncryptionNotifications( case "darwin": mp, ok := capabilities.FromContext(ctx) if !ok { - level.Debug(svc.logger).Log("msg", "no capabilities in context, skipping disk encryption notification") + svc.logger.DebugContext(ctx, "no capabilities in context, skipping disk encryption notification") return nil } if !mp.Has(fleet.CapabilityEscrowBuddy) { - level.Debug(svc.logger).Log("msg", "host doesn't support Escrow Buddy, skipping disk encryption notification", "host_uuid", host.UUID) + svc.logger.DebugContext(ctx, "host doesn't support Escrow Buddy, skipping disk encryption notification", "host_uuid", host.UUID) return nil } @@ -966,7 +965,7 @@ func (svc *Service) SaveHostScriptResult(ctx context.Context, result *fleet.Host }, true); err != nil { return ctxerr.Wrap(ctx, err, "update setup experience status") } else if updated { - level.Debug(svc.logger).Log("msg", "setup experience script result updated", "host_uuid", host.UUID, "execution_id", result.ExecutionID) + svc.logger.DebugContext(ctx, "setup experience script result updated", "host_uuid", host.UUID, "execution_id", result.ExecutionID) fromSetupExperience = true _, err := svc.EnterpriseOverrides.SetupExperienceNextStep(ctx, host) if err != nil { @@ -1079,16 +1078,16 @@ func (svc *Service) SaveHostScriptResult(ctx context.Context, result *fleet.Host if scriptFailed { shouldRetry, err := svc.shouldRetryPolicyAutomationScript(ctx, host, hsr) if err != nil { - level.Error(svc.logger).Log( - "msg", "failed to check if policy automation script should retry", + svc.logger.ErrorContext(ctx, + "failed to check if policy automation script should retry", "host_id", host.ID, "policy_id", *hsr.PolicyID, "err", err, ) } else if shouldRetry { if err := svc.retryPolicyAutomationScript(ctx, host, hsr); err != nil { - level.Error(svc.logger).Log( - "msg", "failed to queue policy automation script retry", + svc.logger.ErrorContext(ctx, + "failed to queue policy automation script retry", "host_id", host.ID, "policy_id", *hsr.PolicyID, "err", err, @@ -1194,8 +1193,8 @@ func (svc *Service) SetOrUpdateDiskEncryptionKey(ctx context.Context, encryption // Only archive the key if disk encryption is enabled for this host (team/globally) if !osquery_utils.IsDiskEncryptionEnabledForHost(ctx, svc.logger.SlogLogger(), svc.ds, host) { - level.Debug(svc.logger).Log( - "msg", "skipping key archival, disk encryption not enabled for host team/globally", + svc.logger.DebugContext(ctx, + "skipping key archival, disk encryption not enabled for host team/globally", "host_id", host.ID, ) return nil @@ -1240,8 +1239,8 @@ func (svc *Service) SetOrUpdateDiskEncryptionKey(ctx context.Context, encryption }, ); err != nil { // OK: this is not critical to the operation of the endpoint - level.Error(svc.logger).Log( - "msg", "record fleet disk encryption key escrowed activity", + svc.logger.ErrorContext(ctx, + "record fleet disk encryption key escrowed activity", "err", err, ) ctxerr.Handle(ctx, err) @@ -1302,8 +1301,8 @@ func (svc *Service) EscrowLUKSData(ctx context.Context, passphrase string, salt // Only archive the key if disk encryption is enabled for this host (team/globally) if !osquery_utils.IsDiskEncryptionEnabledForHost(ctx, svc.logger.SlogLogger(), svc.ds, host) { - level.Debug(svc.logger).Log( - "msg", "skipping LUKS key archival, disk encryption not enabled for host team/globally", + svc.logger.DebugContext(ctx, + "skipping LUKS key archival, disk encryption not enabled for host team/globally", "host_id", host.ID, ) return nil @@ -1333,8 +1332,8 @@ func (svc *Service) EscrowLUKSData(ctx context.Context, passphrase string, salt }, ); err != nil { // OK: this is not critical to the operation of the endpoint - level.Error(svc.logger).Log( - "msg", "record fleet disk encryption key escrowed activity", + svc.logger.ErrorContext(ctx, + "record fleet disk encryption key escrowed activity", "err", err, ) ctxerr.Handle(ctx, err) @@ -1562,8 +1561,8 @@ func (svc *Service) SaveHostSoftwareInstallResult(ctx context.Context, result *f }, true); err != nil { return ctxerr.Wrap(ctx, err, "update setup experience status") } else if updated { - level.Debug(svc.logger).Log( - "msg", "setup experience software install result updated", + svc.logger.DebugContext(ctx, + "setup experience software install result updated", "host_uuid", hostUUID, "execution_id", result.InstallUUID, ) @@ -1608,16 +1607,16 @@ func (svc *Service) SaveHostSoftwareInstallResult(ctx context.Context, result *f if status == fleet.SoftwareInstallFailed { shouldRetry, err := svc.shouldRetryPolicyAutomationSoftwareInstall(ctx, host, hsi) if err != nil { - level.Error(svc.logger).Log( - "msg", "failed to check if policy automation software install should retry", + svc.logger.ErrorContext(ctx, + "failed to check if policy automation software install should retry", "host_id", host.ID, "policy_id", *hsi.PolicyID, "err", err, ) } else if shouldRetry { if err := svc.retryPolicyAutomationSoftwareInstall(ctx, host, hsi); err != nil { - level.Error(svc.logger).Log( - "msg", "failed to queue policy automation software install retry", + svc.logger.ErrorContext(ctx, + "failed to queue policy automation software install retry", "host_id", host.ID, "policy_id", *hsi.PolicyID, "err", err, @@ -1643,16 +1642,16 @@ func (svc *Service) SaveHostSoftwareInstallResult(ctx context.Context, result *f if hsi.PolicyID == nil && status == fleet.SoftwareInstallFailed { shouldRetry, retryErr := svc.shouldRetrySoftwareInstall(ctx, hsi) if retryErr != nil { - level.Error(svc.logger).Log( - "msg", "failed to check if software install should retry", + svc.logger.ErrorContext(ctx, + "failed to check if software install should retry", "host_id", host.ID, "install_uuid", result.InstallUUID, "err", retryErr, ) } else if shouldRetry { if retryErr := svc.retrySoftwareInstall(ctx, host, hsi, fromSetupExperience); retryErr != nil { - level.Error(svc.logger).Log( - "msg", "failed to queue software install retry", + svc.logger.ErrorContext(ctx, + "failed to queue software install retry", "host_id", host.ID, "install_uuid", result.InstallUUID, "err", retryErr, @@ -1718,8 +1717,8 @@ func (svc *Service) shouldRetryPolicyAutomationSoftwareInstall(ctx context.Conte // retryPolicyAutomationSoftwareInstall queues a retry for a policy automation software install. func (svc *Service) retryPolicyAutomationSoftwareInstall(ctx context.Context, host *fleet.Host, hsi *fleet.HostSoftwareInstallerResult) error { - level.Info(svc.logger).Log( - "msg", "queuing policy automation software install retry", + svc.logger.InfoContext(ctx, + "queuing policy automation software install retry", "host_id", host.ID, "policy_id", *hsi.PolicyID, "software_installer_id", *hsi.SoftwareInstallerID, @@ -1741,8 +1740,8 @@ func (svc *Service) shouldRetrySoftwareInstall(ctx context.Context, hsi *fleet.H // retrySoftwareInstall queues a retry for a non-policy software install. func (svc *Service) retrySoftwareInstall(ctx context.Context, host *fleet.Host, hsi *fleet.HostSoftwareInstallerResult, fromSetupExperience bool) error { - level.Info(svc.logger).Log( - "msg", "queuing software install retry", + svc.logger.InfoContext(ctx, + "queuing software install retry", "host_id", host.ID, "software_installer_id", *hsi.SoftwareInstallerID, "self_service", hsi.SelfService, @@ -1782,8 +1781,8 @@ func (svc *Service) shouldRetryPolicyAutomationScript(ctx context.Context, host // retryPolicyAutomationScript queues a retry for a policy automation script. func (svc *Service) retryPolicyAutomationScript(ctx context.Context, host *fleet.Host, hsr *fleet.HostScriptResult) error { - level.Info(svc.logger).Log( - "msg", "queuing policy automation script retry", + svc.logger.InfoContext(ctx, + "queuing policy automation script retry", "host_id", host.ID, "policy_id", *hsr.PolicyID, "script_id", *hsr.ScriptID, diff --git a/server/service/queries.go b/server/service/queries.go index 75b32ee3e5a..c4f56509f37 100644 --- a/server/service/queries.go +++ b/server/service/queries.go @@ -12,7 +12,6 @@ import ( "github.com/fleetdm/fleet/v4/server/contexts/viewer" "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/ptr" - "github.com/go-kit/log/level" ) //////////////////////////////////////////////////////////////////////////////// @@ -497,7 +496,7 @@ func (svc *Service) ModifyQuery(ctx context.Context, id uint, p fleet.QueryPaylo if err != nil { // Log the error but don't fail the request; this will get cleaned up // in the "query_results_cleanup" job. - level.Error(svc.logger).Log("msg", "failed to set query results count", "err", err, "query_id", query.ID) + svc.logger.ErrorContext(ctx, "failed to set query results count", "err", err, "query_id", query.ID) } } @@ -593,7 +592,7 @@ func (svc *Service) DeleteQuery(ctx context.Context, teamID *uint, name string) if err = svc.liveQueryStore.DeleteQueryResultsCount(query.ID); err != nil { // Log the error but don't fail the request; this will get cleaned up // in the "query_results_cleanup" job. - level.Error(svc.logger).Log("msg", "failed to delete query results count", "err", err, "query_id", query.ID) + svc.logger.ErrorContext(ctx, "failed to delete query results count", "err", err, "query_id", query.ID) } } @@ -671,7 +670,7 @@ func (svc *Service) DeleteQueryByID(ctx context.Context, id uint) error { if err = svc.liveQueryStore.DeleteQueryResultsCount(query.ID); err != nil { // Log the error but don't fail the request; this will get cleaned up // in the "query_results_cleanup" job. - level.Error(svc.logger).Log("msg", "failed to delete query results count", "err", err, "query_id", query.ID) + svc.logger.ErrorContext(ctx, "failed to delete query results count", "err", err, "query_id", query.ID) } } @@ -767,7 +766,7 @@ func (svc *Service) DeleteQueries(ctx context.Context, ids []uint) (uint, error) if err = svc.liveQueryStore.DeleteQueryResultsCount(id); err != nil { // Log the error but don't fail the request; this will get cleaned up // in the "query_results_cleanup" job. - level.Error(svc.logger).Log("msg", "failed to delete query results count", "err", err, "query_id", id) + svc.logger.ErrorContext(ctx, "failed to delete query results count", "err", err, "query_id", id) } } } @@ -871,7 +870,7 @@ func (svc *Service) ApplyQuerySpecs(ctx context.Context, specs []*fleet.QuerySpe if err = svc.liveQueryStore.SetQueryResultsCount(queryID, 0); err != nil { // Log the error but don't fail the request; this will get cleaned up // in the "query_results_cleanup" job. - level.Error(svc.logger).Log("msg", "failed to set query results count", "err", err, "query_id", queryID) + svc.logger.ErrorContext(ctx, "failed to set query results count", "err", err, "query_id", queryID) } } } diff --git a/server/service/schedule/schedule.go b/server/service/schedule/schedule.go index 5f3629b32d4..94eb5d30a6d 100644 --- a/server/service/schedule/schedule.go +++ b/server/service/schedule/schedule.go @@ -15,7 +15,6 @@ import ( "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/platform/logging" - "github.com/go-kit/log/level" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" @@ -208,7 +207,7 @@ func New( func (s *Schedule) Start() { prevScheduledRun, _, err := s.GetLatestStats(s.ctx) if err != nil { - level.Error(s.logger).Log("err", "start schedule", "details", err) + s.logger.ErrorContext(s.ctx, "start schedule", "err", err) ctxerr.Handle(s.ctx, err) } @@ -241,7 +240,7 @@ func (s *Schedule) Start() { }() for { - level.Debug(s.logger).Log("msg", fmt.Sprintf("%v remaining until next tick", s.getRemainingInterval(s.intervalStartedAt))) + s.logger.DebugContext(s.ctx, fmt.Sprintf("%v remaining until next tick", s.getRemainingInterval(s.intervalStartedAt))) select { case <-s.ctx.Done(): @@ -256,11 +255,11 @@ func (s *Schedule) Start() { attribute.String("cron.type", "triggered"), ) - level.Debug(s.logger).Log("msg", "done, trigger received") + s.logger.DebugContext(ctx, "done, trigger received") ok, cancelHold := s.holdLock(ctx) if !ok { - level.Debug(s.logger).Log("msg", "unable to acquire lock") + s.logger.DebugContext(ctx, "unable to acquire lock") span.End() continue } @@ -270,7 +269,7 @@ func (s *Schedule) Start() { // instance to the actual worker instance ID. if claimedStatsID > 0 { if err := s.statsStore.ClaimCronStats(ctx, claimedStatsID, s.instanceID, fleet.CronStatsStatusPending); err != nil { - level.Error(s.logger).Log("err", "claiming queued trigger", "details", err) + s.logger.ErrorContext(ctx, "claiming queued trigger", "err", err) ctxerr.Handle(ctx, err) // there is an issue with this stats record; fall through to create a new stats record claimedStatsID = 0 @@ -281,7 +280,7 @@ func (s *Schedule) Start() { prevScheduledRun, _, err := s.GetLatestStats(ctx) if err != nil { - level.Error(s.logger).Log("err", "trigger get cron stats", "details", err) + s.logger.ErrorContext(ctx, "trigger get cron stats", "err", err) ctxerr.Handle(ctx, err) } @@ -301,7 +300,7 @@ func (s *Schedule) Start() { newStart := intervalStartedAt.Add(time.Since(intervalStartedAt).Truncate(schedInterval)) // advances start time by the number of full interval elasped s.setIntervalStartedAt(newStart) schedTicker.Reset(s.getRemainingInterval(newStart)) - level.Debug(s.logger).Log("msg", fmt.Sprintf("triggered run spanned schedule interval, new wait %v", s.getRemainingInterval(newStart))) + s.logger.DebugContext(ctx, fmt.Sprintf("triggered run spanned schedule interval, new wait %v", s.getRemainingInterval(newStart))) } cancelHold() @@ -315,13 +314,13 @@ func (s *Schedule) Start() { attribute.String("cron.type", "scheduled_tick"), ) - level.Debug(s.logger).Log("msg", "done, tick received") + s.logger.DebugContext(ctx, "done, tick received") schedInterval := s.getSchedInterval() prevScheduledRun, prevTriggeredRun, err := s.GetLatestStats(ctx) if err != nil { - level.Error(s.logger).Log("err", "get cron stats", "details", err) + s.logger.ErrorContext(ctx, "get cron stats", "err", err) ctxerr.Handle(ctx, err) // skip ahead to the next interval schedTicker.Reset(schedInterval) @@ -331,7 +330,7 @@ func (s *Schedule) Start() { if prevScheduledRun.Status == fleet.CronStatsStatusPending || prevTriggeredRun.Status == fleet.CronStatsStatusPending { // skip ahead to the next interval - level.Info(s.logger).Log("msg", fmt.Sprintf("pending job might still be running, wait %v", schedInterval)) + s.logger.InfoContext(ctx, fmt.Sprintf("pending job might still be running, wait %v", schedInterval)) schedTicker.Reset(schedInterval) span.End() continue @@ -348,7 +347,7 @@ func (s *Schedule) Start() { if time.Since(intervalStartedAt) < schedInterval { // wait for the remaining interval plus a small buffer newWait := s.getRemainingInterval(intervalStartedAt) + 100*time.Millisecond - level.Info(s.logger).Log("msg", fmt.Sprintf("wait remaining interval %v", newWait)) + s.logger.InfoContext(ctx, fmt.Sprintf("wait remaining interval %v", newWait)) schedTicker.Reset(newWait) span.End() continue @@ -359,14 +358,14 @@ func (s *Schedule) Start() { newStart := intervalStartedAt.Add(time.Since(intervalStartedAt).Truncate(schedInterval)) // advances start time by the number of full interval elasped s.setIntervalStartedAt(newStart) schedTicker.Reset(s.getRemainingInterval(newStart)) - level.Debug(s.logger).Log("msg", fmt.Sprintf("prior run spanned schedule interval, new wait %v", s.getRemainingInterval(newStart))) + s.logger.DebugContext(ctx, fmt.Sprintf("prior run spanned schedule interval, new wait %v", s.getRemainingInterval(newStart))) span.End() continue } ok, cancelHold := s.holdLock(ctx) if !ok { - level.Debug(s.logger).Log("msg", "unable to acquire lock") + s.logger.DebugContext(ctx, "unable to acquire lock") schedTicker.Reset(schedInterval) span.End() continue @@ -386,7 +385,7 @@ func (s *Schedule) Start() { // tick that would have overlapped with the 1.5hrs running time) schedInterval = s.getSchedInterval() if time.Since(newStart) > schedInterval { - level.Info(s.logger).Log("msg", fmt.Sprintf("total runtime (%v) exceeded schedule interval (%v)", time.Since(newStart), schedInterval)) + s.logger.InfoContext(ctx, fmt.Sprintf("total runtime (%v) exceeded schedule interval (%v)", time.Since(newStart), schedInterval)) newStart = newStart.Add(time.Since(newStart).Truncate(schedInterval)) // advances start time by the number of full interval elasped s.setIntervalStartedAt(newStart) } @@ -416,14 +415,14 @@ func (s *Schedule) Start() { prevInterval := s.getSchedInterval() newInterval, err := s.configReloadIntervalFn(s.ctx) if err != nil { - level.Error(s.logger).Log("err", "schedule interval config reload failed", "details", err) + s.logger.ErrorContext(s.ctx, "schedule interval config reload failed", "err", err) ctxerr.Handle(s.ctx, err) continue } newInterval = truncateSecondsWithFloor(newInterval) if newInterval <= 0 { - level.Debug(s.logger).Log("msg", "config reload interval method returned invalid interval") + s.logger.DebugContext(s.ctx, "config reload interval method returned invalid interval") continue } if prevInterval == newInterval { @@ -440,8 +439,8 @@ func (s *Schedule) Start() { clearScheduleChannels(s.trigger, schedTicker.C) schedTicker.Reset(newWait) - level.Debug(s.logger).Log("msg", fmt.Sprintf("new schedule interval %v", newInterval)) - level.Debug(s.logger).Log("msg", fmt.Sprintf("time until next schedule tick %v", newWait)) + s.logger.DebugContext(s.ctx, fmt.Sprintf("new schedule interval %v", newInterval)) + s.logger.DebugContext(s.ctx, fmt.Sprintf("time until next schedule tick %v", newWait)) } } }() @@ -464,7 +463,7 @@ func (s *Schedule) Start() { go func() { g.Wait() - level.Debug(s.logger).Log("msg", "close schedule") + s.logger.DebugContext(s.ctx, "close schedule") close(s.done) // communicates that the scheduler has finished running its goroutines schedTicker.Stop() }() @@ -495,7 +494,7 @@ func (s *Schedule) Trigger(ctx context.Context) (stats *fleet.CronStats, didTrig case s.trigger <- 0: didTrigger = true default: - level.Debug(s.logger).Log("msg", "trigger channel not available") + s.logger.DebugContext(ctx, "trigger channel not available") } return nil, didTrigger, nil } @@ -515,19 +514,19 @@ func (s *Schedule) runWithStats(ctx context.Context, statsType fleet.CronStatsTy var err error statsID, err = s.insertStats(ctx, statsType, fleet.CronStatsStatusPending) if err != nil { - level.Error(s.logger).Log("err", fmt.Sprintf("insert cron stats %s", s.name), "details", err) + s.logger.ErrorContext(ctx, fmt.Sprintf("insert cron stats %s", s.name), "err", err) ctxerr.Handle(ctx, err) } - level.Info(s.logger).Log("status", "pending") + s.logger.InfoContext(ctx, "pending") } s.runAllJobs(ctx) if err := s.updateStats(ctx, statsID, fleet.CronStatsStatusCompleted); err != nil { - level.Error(s.logger).Log("err", fmt.Sprintf("update cron stats %s", s.name), "details", err) + s.logger.ErrorContext(ctx, fmt.Sprintf("update cron stats %s", s.name), "err", err) ctxerr.Handle(ctx, err) } - level.Info(s.logger).Log("status", "completed") + s.logger.InfoContext(ctx, "completed") } // runAllJobs runs all jobs in the schedule with tracing context. @@ -535,10 +534,10 @@ func (s *Schedule) runAllJobs(ctx context.Context) { // Clear errors from the schedule before each run. s.errors = make(fleet.CronScheduleErrors) for _, job := range s.jobs { - level.Debug(s.logger).Log("msg", "starting", "jobID", job.ID) + s.logger.DebugContext(ctx, "starting", "jobID", job.ID) if err := runJob(ctx, job.Fn); err != nil { s.errors[job.ID] = err - level.Error(s.logger).Log("err", "running job", "details", err, "jobID", job.ID) + s.logger.ErrorContext(ctx, "running job", "err", err, "jobID", job.ID) ctxerr.Handle(ctx, err) } } @@ -556,7 +555,7 @@ func (s *Schedule) pollForQueuedTrigger() { _, trig, err := s.GetLatestStats(ctx) if err != nil { - level.Error(s.logger).Log("err", "trigger poll get cron stats", "details", err) + s.logger.ErrorContext(ctx, "trigger poll get cron stats", "err", err) ctxerr.Handle(ctx, err) return } @@ -565,7 +564,7 @@ func (s *Schedule) pollForQueuedTrigger() { // Non-blocking: if the handler is busy, the record stays queued and the next poll will try again. select { case s.trigger <- trig.ID: - level.Info(s.logger).Log("msg", "picked up queued trigger", "stats_id", trig.ID) + s.logger.InfoContext(ctx, "picked up queued trigger", "stats_id", trig.ID) default: } } @@ -641,12 +640,12 @@ func (s *Schedule) getRemainingInterval(start time.Time) time.Duration { func (s *Schedule) acquireLock(ctx context.Context) bool { ok, err := s.locker.Lock(ctx, s.getLockName(), s.instanceID, s.getSchedInterval()) if err != nil { - level.Error(s.logger).Log("msg", "lock failed", "err", err) + s.logger.ErrorContext(ctx, "lock failed", "err", err) ctxerr.Handle(ctx, err) return false } if !ok { - level.Debug(s.logger).Log("msg", "not the lock leader, skipping") + s.logger.DebugContext(ctx, "not the lock leader, skipping") return false } return true @@ -655,7 +654,7 @@ func (s *Schedule) acquireLock(ctx context.Context) bool { func (s *Schedule) releaseLock(ctx context.Context) { err := s.locker.Unlock(ctx, s.getLockName(), s.instanceID) if err != nil { - level.Error(s.logger).Log("msg", "unlock failed", "err", err) + s.logger.ErrorContext(ctx, "unlock failed", "err", err) ctxerr.Handle(ctx, err) } } @@ -717,7 +716,7 @@ func (s *Schedule) GetLatestStats(ctx context.Context) (fleet.CronStats, fleet.C case fleet.CronStatsTypeTriggered: triggered = stats default: - level.Error(s.logger).Log("msg", fmt.Sprintf("get latest stats unexpected type: %s", stats.StatsType)) + s.logger.ErrorContext(ctx, fmt.Sprintf("get latest stats unexpected type: %s", stats.StatsType)) } } diff --git a/server/service/users.go b/server/service/users.go index 172d4555629..2aa648ae7d9 100644 --- a/server/service/users.go +++ b/server/service/users.go @@ -10,8 +10,6 @@ import ( "net/http" "time" - "github.com/go-kit/log/level" - "github.com/fleetdm/fleet/v4/server" "github.com/fleetdm/fleet/v4/server/authz" authz_ctx "github.com/fleetdm/fleet/v4/server/contexts/authz" @@ -135,7 +133,7 @@ func (svc *Service) CreateUser(ctx context.Context, p fleet.UserPayload) (*fleet if user.APIOnly && !user.SSOEnabled { if p.Password == nil { // Should not happen but let's log just in case. - level.Error(svc.logger).Log("err", err, "msg", "password not set during admin user creation") + svc.logger.ErrorContext(ctx, "password not set during admin user creation", "err", err) } else { // Create a session for the API-only user by logging in. _, session, err := svc.Login(ctx, user.Email, *p.Password, false) @@ -1282,7 +1280,7 @@ func (svc *Service) RequestPasswordReset(ctx context.Context, email string) erro err = svc.mailService.SendEmail(ctx, resetEmail) if err != nil { - level.Error(svc.logger).Log("err", err, "msg", "failed to send password reset request email") + svc.logger.ErrorContext(ctx, "failed to send password reset request email", "err", err) } return err }