diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index 5c0bc9b957e..b64206b7b07 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -23,11 +23,11 @@ package accesspoint import ( "context" + "log/slog" "slices" "time" "github.com/gravitational/trace" - log "github.com/sirupsen/logrus" oteltrace "go.opentelemetry.io/otel/trace" "github.com/gravitational/teleport" @@ -124,7 +124,7 @@ func NewCache(cfg Config) (*cache.Cache, error) { if err := cfg.CheckAndSetDefaults(); err != nil { return nil, trace.Wrap(err) } - log.Debugf("Creating in-memory backend for %v.", cfg.CacheName) + slog.DebugContext(cfg.Context, "Creating in-memory backend cache.", "cache_name", cfg.CacheName) mem, err := memory.New(memory.Config{ Context: cfg.Context, EventsOff: !cfg.EventsSystem, diff --git a/lib/auth/dbobject/dbobjectv1/service.go b/lib/auth/dbobject/dbobjectv1/service.go index b0318265dc7..39b04d07a1c 100644 --- a/lib/auth/dbobject/dbobjectv1/service.go +++ b/lib/auth/dbobject/dbobjectv1/service.go @@ -20,9 +20,9 @@ package dbobjectv1 import ( "context" + "log/slog" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/emptypb" "github.com/gravitational/teleport" @@ -43,7 +43,7 @@ type Backend interface { type DatabaseObjectServiceConfig struct { Authorizer authz.Authorizer Backend Backend - Logger logrus.FieldLogger + Logger *slog.Logger } // NewDatabaseObjectService returns a new instance of the DatabaseObjectService. @@ -55,7 +55,7 @@ func NewDatabaseObjectService(cfg DatabaseObjectServiceConfig) (*DatabaseObjectS return nil, trace.BadParameter("backend service is required") } if cfg.Logger == nil { - cfg.Logger = logrus.WithField(teleport.ComponentKey, "db_object") + cfg.Logger = slog.With(teleport.ComponentKey, "db_object") } return &DatabaseObjectService{ logger: cfg.Logger, @@ -72,7 +72,7 @@ type DatabaseObjectService struct { backend Backend authorizer authz.Authorizer - logger logrus.FieldLogger + logger *slog.Logger } func (rs *DatabaseObjectService) authorize(ctx context.Context, adminAction bool, verb string, additionalVerbs ...string) error { diff --git a/lib/auth/dbobjectimportrule/dbobjectimportrulev1/service.go b/lib/auth/dbobjectimportrule/dbobjectimportrulev1/service.go index a5d67243cda..03e169994dc 100644 --- a/lib/auth/dbobjectimportrule/dbobjectimportrulev1/service.go +++ b/lib/auth/dbobjectimportrule/dbobjectimportrulev1/service.go @@ -20,9 +20,9 @@ package dbobjectimportrulev1 import ( "context" + "log/slog" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/emptypb" "github.com/gravitational/teleport" @@ -43,7 +43,7 @@ type Backend interface { type DatabaseObjectImportRuleServiceConfig struct { Authorizer authz.Authorizer Backend Backend - Logger logrus.FieldLogger + Logger *slog.Logger } // NewDatabaseObjectImportRuleService returns a new instance of the DatabaseObjectImportRuleService. @@ -55,7 +55,7 @@ func NewDatabaseObjectImportRuleService(cfg DatabaseObjectImportRuleServiceConfi return nil, trace.BadParameter("backend service is required") } if cfg.Logger == nil { - cfg.Logger = logrus.WithField(teleport.ComponentKey, "db_obj_import_rule") + cfg.Logger = slog.With(teleport.ComponentKey, "db_obj_import_rule") } return &DatabaseObjectImportRuleService{ logger: cfg.Logger, @@ -72,7 +72,7 @@ type DatabaseObjectImportRuleService struct { backend Backend authorizer authz.Authorizer - logger logrus.FieldLogger + logger *slog.Logger } func (rs *DatabaseObjectImportRuleService) authorize(ctx context.Context, adminAction bool, verb string, additionalVerbs ...string) error { diff --git a/lib/auth/discoveryconfig/discoveryconfigv1/service.go b/lib/auth/discoveryconfig/discoveryconfigv1/service.go index 400f6eb3691..97450b5e024 100644 --- a/lib/auth/discoveryconfig/discoveryconfigv1/service.go +++ b/lib/auth/discoveryconfig/discoveryconfigv1/service.go @@ -20,10 +20,10 @@ package discoveryconfigv1 import ( "context" + "log/slog" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/emptypb" "github.com/gravitational/teleport" @@ -40,7 +40,7 @@ import ( // ServiceConfig holds configuration options for the DiscoveryConfig gRPC service. type ServiceConfig struct { // Logger is the logger to use. - Logger logrus.FieldLogger + Logger *slog.Logger // Authorizer is the authorizer to use. Authorizer authz.Authorizer @@ -70,7 +70,7 @@ func (s *ServiceConfig) CheckAndSetDefaults() error { } if s.Logger == nil { - s.Logger = logrus.New().WithField(teleport.ComponentKey, "discoveryconfig_crud_service") + s.Logger = slog.With(teleport.ComponentKey, "discoveryconfig_crud_service") } if s.Clock == nil { @@ -84,7 +84,7 @@ func (s *ServiceConfig) CheckAndSetDefaults() error { type Service struct { discoveryconfigv1.UnimplementedDiscoveryConfigServiceServer - log logrus.FieldLogger + log *slog.Logger authorizer authz.Authorizer backend services.DiscoveryConfigs clock clockwork.Clock @@ -189,7 +189,7 @@ func (s *Service) CreateDiscoveryConfig(ctx context.Context, req *discoveryconfi }, ConnectionMetadata: authz.ConnectionMetadata(ctx), }); err != nil { - s.log.WithError(err).Warn("Failed to emit discovery config create event.") + s.log.WarnContext(ctx, "Failed to emit discovery config create event.", "error", err) } return conv.ToProto(resp), nil @@ -235,7 +235,7 @@ func (s *Service) UpdateDiscoveryConfig(ctx context.Context, req *discoveryconfi }, ConnectionMetadata: authz.ConnectionMetadata(ctx), }); err != nil { - s.log.WithError(err).Warn("Failed to emit discovery config update event.") + s.log.WarnContext(ctx, "Failed to emit discovery config update event.", "error", err) } return conv.ToProto(resp), nil @@ -278,7 +278,7 @@ func (s *Service) UpsertDiscoveryConfig(ctx context.Context, req *discoveryconfi }, ConnectionMetadata: authz.ConnectionMetadata(ctx), }); err != nil { - s.log.WithError(err).Warn("Failed to emit discovery config create event.") + s.log.WarnContext(ctx, "Failed to emit discovery config create event.", "error", err) } return conv.ToProto(resp), nil @@ -310,7 +310,7 @@ func (s *Service) DeleteDiscoveryConfig(ctx context.Context, req *discoveryconfi }, ConnectionMetadata: authz.ConnectionMetadata(ctx), }); err != nil { - s.log.WithError(err).Warn("Failed to emit discovery config delete event.") + s.log.WarnContext(ctx, "Failed to emit discovery config delete event.", "error", err) } return &emptypb.Empty{}, nil @@ -339,7 +339,7 @@ func (s *Service) DeleteAllDiscoveryConfigs(ctx context.Context, _ *discoverycon UserMetadata: authCtx.GetUserMetadata(), ConnectionMetadata: authz.ConnectionMetadata(ctx), }); err != nil { - s.log.WithError(err).Warn("Failed to emit discovery config delete all event.") + s.log.WarnContext(ctx, "Failed to emit discovery config delete all event.", "error", err) } return &emptypb.Empty{}, nil diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 2ed1e532d08..b4423f49eaf 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -5091,6 +5091,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { dbObjectImportRuleService, err := dbobjectimportrulev1.NewDatabaseObjectImportRuleService(dbobjectimportrulev1.DatabaseObjectImportRuleServiceConfig{ Authorizer: cfg.Authorizer, Backend: cfg.AuthServer.Services, + Logger: cfg.AuthServer.logger.With(teleport.ComponentKey, "db_obj_import_rule"), }) if err != nil { return nil, trace.Wrap(err, "creating database objectImportRule service") @@ -5100,6 +5101,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { dbObjectService, err := dbobjectv1.NewDatabaseObjectService(dbobjectv1.DatabaseObjectServiceConfig{ Authorizer: cfg.Authorizer, Backend: cfg.AuthServer.Services, + Logger: cfg.AuthServer.logger.With(teleport.ComponentKey, "db_object"), }) if err != nil { return nil, trace.Wrap(err, "creating database object service") @@ -5164,6 +5166,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { KeyStoreManager: cfg.AuthServer.GetKeyStore(), Clock: cfg.AuthServer.clock, Emitter: cfg.Emitter, + Logger: cfg.AuthServer.logger.With(teleport.ComponentKey, "integrations.service"), }) if err != nil { return nil, trace.Wrap(err) @@ -5197,6 +5200,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { Backend: cfg.AuthServer.Services, Clock: cfg.AuthServer.clock, Emitter: cfg.Emitter, + Logger: cfg.AuthServer.logger.With(teleport.ComponentKey, "discoveryconfig_crud_service"), }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/auth/init.go b/lib/auth/init.go index 75041f7b9cc..9757028fc99 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -531,7 +531,7 @@ func initCluster(ctx context.Context, cfg InitConfig, asrv *Server) error { cfg.ClusterName = cn // Apply any outstanding migrations. - if err := migration.Apply(ctx, cfg.Backend); err != nil { + if err := migration.Apply(ctx, asrv.logger, cfg.Backend); err != nil { return trace.Wrap(err, "applying migrations") } diff --git a/lib/auth/integration/integrationv1/service.go b/lib/auth/integration/integrationv1/service.go index 4a4d5638baf..68831213c0f 100644 --- a/lib/auth/integration/integrationv1/service.go +++ b/lib/auth/integration/integrationv1/service.go @@ -22,10 +22,10 @@ import ( "context" "crypto" "fmt" + "log/slog" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/emptypb" "github.com/gravitational/teleport" @@ -66,7 +66,7 @@ type ServiceConfig struct { Backend services.Integrations Cache Cache KeyStoreManager KeyStoreManager - Logger *logrus.Entry + Logger *slog.Logger Clock clockwork.Clock Emitter apievents.Emitter } @@ -96,7 +96,7 @@ func (s *ServiceConfig) CheckAndSetDefaults() error { } if s.Logger == nil { - s.Logger = logrus.WithField(teleport.ComponentKey, "integrations.service") + s.Logger = slog.With(teleport.ComponentKey, "integrations.service") } if s.Clock == nil { @@ -113,7 +113,7 @@ type Service struct { cache Cache keyStoreManager KeyStoreManager backend services.Integrations - logger *logrus.Entry + logger *slog.Logger clock clockwork.Clock emitter apievents.Emitter } @@ -209,7 +209,7 @@ func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.Crea igMeta, err := getIntegrationMetadata(ig) if err != nil { - s.logger.WithError(err).Warn("Failed to build all integration metadata for audit event") + s.logger.WarnContext(ctx, "Failed to build all integration metadata for audit event.", "error", err) } if err := s.emitter.EmitAuditEvent(ctx, &apievents.IntegrationCreate{ @@ -225,7 +225,7 @@ func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.Crea IntegrationMetadata: igMeta, ConnectionMetadata: authz.ConnectionMetadata(ctx), }); err != nil { - s.logger.WithError(err).Warn("Failed to emit integration create event.") + s.logger.WarnContext(ctx, "Failed to emit integration create event.", "error", err) } igV1, ok := ig.(*types.IntegrationV1) @@ -254,7 +254,7 @@ func (s *Service) UpdateIntegration(ctx context.Context, req *integrationpb.Upda igMeta, err := getIntegrationMetadata(ig) if err != nil { - s.logger.WithError(err).Warn("Failed to build all integration metadata for audit event") + s.logger.WarnContext(ctx, "Failed to build all integration metadata for audit event.", "error", err) } if err := s.emitter.EmitAuditEvent(ctx, &apievents.IntegrationUpdate{ @@ -270,7 +270,7 @@ func (s *Service) UpdateIntegration(ctx context.Context, req *integrationpb.Upda IntegrationMetadata: igMeta, ConnectionMetadata: authz.ConnectionMetadata(ctx), }); err != nil { - s.logger.WithError(err).Warn("Failed to emit integration update event.") + s.logger.WarnContext(ctx, "Failed to emit integration update event.", "error", err) } igV1, ok := ig.(*types.IntegrationV1) @@ -303,7 +303,7 @@ func (s *Service) DeleteIntegration(ctx context.Context, req *integrationpb.Dele igMeta, err := getIntegrationMetadata(ig) if err != nil { - s.logger.WithError(err).Warn("Failed to build all integration metadata for audit event") + s.logger.WarnContext(ctx, "Failed to build all integration metadata for audit event.", "error", err) } if err := s.emitter.EmitAuditEvent(ctx, &apievents.IntegrationDelete{ @@ -318,7 +318,7 @@ func (s *Service) DeleteIntegration(ctx context.Context, req *integrationpb.Dele IntegrationMetadata: igMeta, ConnectionMetadata: authz.ConnectionMetadata(ctx), }); err != nil { - s.logger.WithError(err).Warn("Failed to emit integration delete event.") + s.logger.WarnContext(ctx, "Failed to emit integration delete event.", "error", err) } return &emptypb.Empty{}, nil diff --git a/lib/auth/keygen/keygen.go b/lib/auth/keygen/keygen.go index ce8a26dd78d..a4d185c722d 100644 --- a/lib/auth/keygen/keygen.go +++ b/lib/auth/keygen/keygen.go @@ -22,12 +22,12 @@ import ( "context" "crypto/rand" "fmt" + "log/slog" "strings" "time" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - log "github.com/sirupsen/logrus" "golang.org/x/crypto/ssh" "github.com/gravitational/teleport" @@ -125,8 +125,11 @@ func (k *Keygen) GenerateHostCertWithoutValidation(c services.HostCertParams) ([ return nil, trace.Wrap(err) } - log.Debugf("Generated SSH host certificate for role %v with principals: %v.", - c.Role, principals) + slog.DebugContext( + context.TODO(), + "Generated SSH host certificate.", + "role", c.Role, "principals", principals, + ) return ssh.MarshalAuthorizedKey(cert), nil } @@ -150,7 +153,13 @@ func (k *Keygen) GenerateUserCertWithoutValidation(c services.UserCertParams) ([ if c.TTL != 0 { b := k.clock.Now().UTC().Add(c.TTL) validBefore = uint64(b.Unix()) - log.Debugf("generated user key for %v with expiry on (%v) %v", c.AllowedLogins, validBefore, b) + slog.DebugContext( + context.TODO(), + "Generated user key with expiry.", + "allowed_logins", c.AllowedLogins, + "valid_before_unix_ts", validBefore, + "valid_before", b, + ) } cert := &ssh.Certificate{ // we have to use key id to identify teleport user diff --git a/lib/auth/migration/migration.go b/lib/auth/migration/migration.go index 987834f10ac..299ef020795 100644 --- a/lib/auth/migration/migration.go +++ b/lib/auth/migration/migration.go @@ -22,16 +22,15 @@ import ( "cmp" "context" "encoding/json" + "log/slog" "slices" "time" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" oteltrace "go.opentelemetry.io/otel/trace" - "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/observability/tracing" "github.com/gravitational/teleport/lib/backend" ) @@ -51,10 +50,6 @@ func withMigrations(m []migration) func(c *applyConfig) { } } -var log = logrus.WithFields(logrus.Fields{ - teleport.ComponentKey: teleport.ComponentAuth, -}) - var tracer = tracing.NewTracer("migrations") // migration is an interface responsible for applying data migrations to the backend. @@ -77,7 +72,7 @@ type migration interface { } // Apply executes any outstanding registered migrations. -func Apply(ctx context.Context, b backend.Backend, opts ...func(c *applyConfig)) (err error) { +func Apply(ctx context.Context, log *slog.Logger, b backend.Backend, opts ...func(c *applyConfig)) (err error) { cfg := applyConfig{ migrations: []migration{ createDBAuthority{}, @@ -120,7 +115,8 @@ func Apply(ctx context.Context, b backend.Backend, opts ...func(c *applyConfig)) continue } - log.Infof("Starting migration %d %s", version, m.Name()) + log := log.With("version", version, "name", m.Name()) + log.InfoContext(ctx, "Starting migration.") span.AddEvent("Starting migration", oteltrace.WithAttributes(attribute.Int("migration", version))) started := time.Now().UTC() @@ -140,7 +136,7 @@ func Apply(ctx context.Context, b backend.Backend, opts ...func(c *applyConfig)) return trace.Wrap(err) } - log.Infof("Completed migration %d %s", version, m.Name()) + log.InfoContext(ctx, "Completed migration.") span.AddEvent("Completed migration", oteltrace.WithAttributes(attribute.Int("migration", version))) } diff --git a/lib/auth/migration/migration_test.go b/lib/auth/migration/migration_test.go index c9877bbda18..a87ffd3ff81 100644 --- a/lib/auth/migration/migration_test.go +++ b/lib/auth/migration/migration_test.go @@ -29,6 +29,7 @@ import ( "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/backend/memory" + "github.com/gravitational/teleport/lib/utils" ) type testMigration struct { @@ -62,6 +63,7 @@ func (t testMigration) Name() string { } func TestApply(t *testing.T) { + log := utils.NewSlogLoggerForTests() cases := []struct { name string migrations []migration @@ -161,7 +163,7 @@ func TestApply(t *testing.T) { require.NoError(t, setCurrentMigration(ctx, b, *test.initialStatus)) } - test.errAssertion(t, Apply(ctx, b, withMigrations(test.migrations))) + test.errAssertion(t, Apply(ctx, log, b, withMigrations(test.migrations))) current, err := getCurrentMigration(ctx, b) require.NoError(t, err)