Change Datastore.logger type to *logging.Logger (#39938)

<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #38889

This is preparatory work before incrementally converting datastore/mysql
files to directly use *slog.Logger.
This will be done by using `logger.SlogLogger()` to get the underlying
`*slog.Logger`

# Checklist for submitter

- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
  - Changes file already exists from previous PR

## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated internal logging infrastructure to use a standardized platform
logging package across database and utility components. This
consolidates logging dependencies and improves system consistency
without affecting user-facing functionality.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Victor Lyuboslavsky
2026-02-17 15:29:52 -06:00
committed by GitHub
parent cd18ced3e9
commit abaeeec6b8
12 changed files with 38 additions and 37 deletions
+3 -3
View File
@@ -7,20 +7,20 @@ import (
"github.com/fleetdm/fleet/v4/server/contexts/ctxdb"
"github.com/fleetdm/fleet/v4/server/fleet"
"github.com/fleetdm/fleet/v4/server/mdm/android"
"github.com/fleetdm/fleet/v4/server/platform/logging"
common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql"
"github.com/go-kit/log"
"github.com/jmoiron/sqlx"
)
// AndroidDatastore is an implementation of android.Datastore interface backed by MySQL
type AndroidDatastore struct {
logger log.Logger
logger *logging.Logger
primary *sqlx.DB
replica fleet.DBReader // so it cannot be used to perform writes
}
// NewAndroidDatastore creates a new Android Datastore
func NewAndroidDatastore(logger log.Logger, primary *sqlx.DB, replica fleet.DBReader) android.Datastore {
func NewAndroidDatastore(logger *logging.Logger, primary *sqlx.DB, replica fleet.DBReader) android.Datastore {
return &AndroidDatastore{
logger: logger,
primary: primary,
+2 -2
View File
@@ -4,8 +4,8 @@ import (
"time"
"github.com/fleetdm/fleet/v4/server/config"
"github.com/fleetdm/fleet/v4/server/platform/logging"
common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql"
"github.com/go-kit/log"
"github.com/ngrok/sqlmw"
)
@@ -18,7 +18,7 @@ const (
type DBOption func(o *common_mysql.DBOptions) error
// Logger adds a Logger to the datastore.
func Logger(l log.Logger) DBOption {
func Logger(l *logging.Logger) DBOption {
return func(o *common_mysql.DBOptions) error {
o.Logger = l
return nil
+3 -2
View File
@@ -30,6 +30,7 @@ import (
"github.com/fleetdm/fleet/v4/server/mdm/android"
nano_push "github.com/fleetdm/fleet/v4/server/mdm/nanomdm/push"
scep_depot "github.com/fleetdm/fleet/v4/server/mdm/scep/depot"
"github.com/fleetdm/fleet/v4/server/platform/logging"
common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql"
"github.com/fleetdm/fleet/v4/server/service/modules/activities"
"github.com/go-kit/log"
@@ -63,7 +64,7 @@ type Datastore struct {
replica fleet.DBReader // so it cannot be used to perform writes
primary *sqlx.DB
logger log.Logger
logger *logging.Logger
clock clock.Clock
config config.MysqlConfig
pusher nano_push.Pusher
@@ -233,7 +234,7 @@ func NewDBConnections(cfg config.MysqlConfig, opts ...DBOption) (*common_mysql.D
options := &common_mysql.DBOptions{
MinLastOpenedAtDiff: defaultMinLastOpenedAtDiff,
MaxAttempts: defaultMaxAttempts,
Logger: log.NewNopLogger(),
Logger: logging.NewNopLogger(),
}
for _, setOpt := range opts {
+9 -9
View File
@@ -22,9 +22,9 @@ import (
"github.com/fleetdm/fleet/v4/server/config"
"github.com/fleetdm/fleet/v4/server/contexts/ctxdb"
"github.com/fleetdm/fleet/v4/server/fleet"
"github.com/fleetdm/fleet/v4/server/platform/logging"
"github.com/fleetdm/fleet/v4/server/platform/mysql/testing_utils"
"github.com/fleetdm/fleet/v4/server/ptr"
"github.com/go-kit/log"
"github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"github.com/stretchr/testify/assert"
@@ -247,7 +247,7 @@ func mockDatastore(t *testing.T) (sqlmock.Sqlmock, *Datastore) {
ds := &Datastore{
primary: dbmock,
replica: dbmock,
logger: log.NewNopLogger(),
logger: logging.NewNopLogger(),
}
return mock, ds
@@ -596,7 +596,7 @@ func TestWhereFilterHostsByTeams(t *testing.T) {
for _, tt := range testCases {
tt := tt
t.Run("", func(t *testing.T) {
ds := &Datastore{logger: log.NewNopLogger()}
ds := &Datastore{logger: logging.NewNopLogger()}
sql := ds.whereFilterHostsByTeams(tt.filter, "hosts")
assert.Equal(t, tt.expected, sql)
})
@@ -631,7 +631,7 @@ func TestWhereOmitIDs(t *testing.T) {
for _, tt := range testCases {
tt := tt
t.Run("", func(t *testing.T) {
ds := &Datastore{logger: log.NewNopLogger()}
ds := &Datastore{logger: logging.NewNopLogger()}
sql := ds.whereOmitIDs("id", tt.omits)
assert.Equal(t, tt.expected, sql)
})
@@ -755,7 +755,7 @@ func newDSWithConfig(t *testing.T, dbName string, config config.MysqlConfig) (*D
_, err = db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS %s; CREATE DATABASE %s;", dbName, dbName))
require.NoError(t, err)
ds, err := New(config, clock.NewMockClock(), Logger(log.NewNopLogger()), LimitAttempts(1))
ds, err := New(config, clock.NewMockClock(), Logger(logging.NewNopLogger()), LimitAttempts(1))
return ds, err
}
@@ -875,7 +875,7 @@ func TestWhereFilterTeams(t *testing.T) {
for _, tt := range testCases {
tt := tt
t.Run("", func(t *testing.T) {
ds := &Datastore{logger: log.NewNopLogger()}
ds := &Datastore{logger: logging.NewNopLogger()}
sql := ds.whereFilterTeams(tt.filter, "t")
assert.Equal(t, tt.expected, sql)
})
@@ -1261,7 +1261,7 @@ func TestWhereFilterTeamWithGlobalStats(t *testing.T) {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
ds := &Datastore{logger: log.NewNopLogger()}
ds := &Datastore{logger: logging.NewNopLogger()}
sql := ds.whereFilterTeamWithGlobalStats(tt.filter, "hosts")
assert.Equal(t, tt.expected, sql)
})
@@ -1462,7 +1462,7 @@ func TestReplicaPasswordReadFromDisk(t *testing.T) {
Database: dbName,
}
conns, err := NewDBConnections(primaryConfig, Replica(&replicaConfig), LimitAttempts(1), Logger(log.NewNopLogger()))
conns, err := NewDBConnections(primaryConfig, Replica(&replicaConfig), LimitAttempts(1), Logger(logging.NewNopLogger()))
require.NoError(t, err, "replica connection should succeed when PasswordPath is used — "+
"if this fails with 'Access denied' the password read from disk was not preserved for the replica")
defer conns.Primary.Close()
@@ -1517,7 +1517,7 @@ func TestReplicaTLSConfigPreserved(t *testing.T) {
//
// Before the fix TLSConfig was empty for the replica's NewDB call, so the
// replica connected without TLS (no error) — meaning this assertion would fail.
_, err := NewDBConnections(primaryConfig, Replica(&replicaConfig), LimitAttempts(1), Logger(log.NewNopLogger()))
_, err := NewDBConnections(primaryConfig, Replica(&replicaConfig), LimitAttempts(1), Logger(logging.NewNopLogger()))
require.Error(t, err, "replica connection should fail with a TLS error when TLSCA is set — "+
"if this succeeds, TLS was silently not applied to the replica")
require.Regexp(t, "(x509|tls|EOF)", err.Error())
+3 -4
View File
@@ -16,11 +16,11 @@ import (
"time"
"github.com/fleetdm/fleet/v4/server/fleet"
"github.com/fleetdm/fleet/v4/server/platform/logging"
"github.com/fleetdm/fleet/v4/server/ptr"
"github.com/fleetdm/fleet/v4/server/test"
"github.com/fleetdm/fleet/v4/server/vulnerabilities/nvd"
"github.com/fleetdm/fleet/v4/server/vulnerabilities/oval"
kitlog "github.com/go-kit/log"
"github.com/google/uuid"
"github.com/jmoiron/sqlx"
"github.com/stretchr/testify/assert"
@@ -1362,7 +1362,7 @@ func testSoftwareSyncHostsSoftware(t *testing.T, ds *Datastore) {
// this call will remove team2 from the software host counts table,
// and would normally log because we have a zero software_id
realLogger := ds.logger
ds.logger = kitlog.NewNopLogger()
ds.logger = logging.NewNopLogger()
require.NoError(t, ds.SyncHostsSoftware(ctx, time.Now()))
ds.logger = realLogger
@@ -2012,8 +2012,7 @@ func testUpdateHostSoftware(t *testing.T, ds *Datastore) {
// Test logging criteria for LastOpenedAt == nil
oldLogger := ds.logger
buf := &bytes.Buffer{}
newLogger := kitlog.NewLogfmtLogger(buf)
ds.logger = newLogger
ds.logger = logging.NewLogfmtLogger(buf)
sw = []fleet.Software{
{Name: "foo", Version: "0.0.1", Source: "test"},
+7 -6
View File
@@ -35,10 +35,9 @@ import (
nanodep_client "github.com/fleetdm/fleet/v4/server/mdm/nanodep/client"
mdmtesting "github.com/fleetdm/fleet/v4/server/mdm/testing_utils"
platform_authz "github.com/fleetdm/fleet/v4/server/platform/authz"
platformlogging "github.com/fleetdm/fleet/v4/server/platform/logging"
"github.com/fleetdm/fleet/v4/server/platform/logging"
common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql"
"github.com/fleetdm/fleet/v4/server/platform/mysql/testing_utils"
"github.com/go-kit/log"
"github.com/google/uuid"
"github.com/jmoiron/sqlx"
"github.com/olekukonko/tablewriter"
@@ -67,9 +66,11 @@ func connectMySQL(t testing.TB, testName string, opts *testing_utils.DatastoreTe
// TODO: for some reason we never log datastore messages when running integration tests, why?
//
// Changes below assume that we want to follows the same pattern as the rest of the codebase.
dslogger := log.NewLogfmtLogger(os.Stdout)
var dslogger *logging.Logger
if os.Getenv("FLEET_INTEGRATION_TESTS_DISABLE_LOG") != "" {
dslogger = log.NewNopLogger()
dslogger = logging.NewNopLogger()
} else {
dslogger = logging.NewLogfmtLogger(os.Stdout)
}
// Use TestSQLMode which combines ANSI mode components with MySQL 8 strict modes
@@ -85,7 +86,7 @@ func connectMySQL(t testing.TB, testName string, opts *testing_utils.DatastoreTe
replicaOpts := &common_mysql.DBOptions{
MinLastOpenedAtDiff: defaultMinLastOpenedAtDiff,
MaxAttempts: 1,
Logger: log.NewNopLogger(),
Logger: logging.NewNopLogger(),
SqlMode: common_mysql.TestSQLMode,
}
setupRealReplica(t, testName, ds, replicaOpts)
@@ -1020,7 +1021,7 @@ func NewTestActivityService(t testing.TB, ds *Datastore) activity_api.Service {
providers := activityacl.NewFleetServiceAdapter(lookupSvc)
// Create service via bootstrap (the public API for creating the bounded context)
svc, _ := activity_bootstrap.New(dbConns, &testingAuthorizer{}, providers, slog.New(platformlogging.DiscardHandler{}))
svc, _ := activity_bootstrap.New(dbConns, &testingAuthorizer{}, providers, slog.New(slog.DiscardHandler))
return svc
}
+1
View File
@@ -104,6 +104,7 @@ func TestMysqlPackageDependencies(t *testing.T) {
m+"/server/platform/mysql...",
// Other infra packages
m+"/server/platform/http",
m+"/server/platform/logging",
m+"/server/contexts/ctxerr",
).
Check()
+2 -1
View File
@@ -9,6 +9,7 @@ import (
"time"
"github.com/fleetdm/fleet/v4/server/contexts/ctxerr"
"github.com/fleetdm/fleet/v4/server/platform/logging"
"github.com/go-kit/log"
"github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
@@ -30,7 +31,7 @@ const TestSQLMode = "'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONL
type DBOptions struct {
// MaxAttempts configures the number of retries to connect to the DB
MaxAttempts int
Logger log.Logger
Logger *logging.Logger
ReplicaConfig *MysqlConfig
Interceptor sqlmw.Interceptor
TracingConfig *LoggingConfig
+2 -2
View File
@@ -12,7 +12,7 @@ import (
"github.com/WatchBeam/clock"
"github.com/fleetdm/fleet/v4/server/config"
"github.com/fleetdm/fleet/v4/server/datastore/mysql"
"github.com/go-kit/log"
"github.com/fleetdm/fleet/v4/server/platform/logging"
)
const (
@@ -62,7 +62,7 @@ func main() {
Address: testAddress,
Database: "schemadb",
}
ds, err := mysql.New(config, clock.NewMockClock(), mysql.Logger(log.NewNopLogger()), mysql.LimitAttempts(1))
ds, err := mysql.New(config, clock.NewMockClock(), mysql.Logger(logging.NewNopLogger()), mysql.LimitAttempts(1))
panicif(err)
defer ds.Close()
panicif(ds.MigrateTables(context.Background()))
+2 -2
View File
@@ -19,7 +19,7 @@ import (
"github.com/fleetdm/fleet/v4/server/config"
"github.com/fleetdm/fleet/v4/server/datastore/mysql"
"github.com/fleetdm/fleet/v4/server/mdm/nanodep/godep"
kitlog "github.com/go-kit/log"
"github.com/fleetdm/fleet/v4/server/platform/logging"
)
func main() {
@@ -58,7 +58,7 @@ func main() {
MaxIdleConns: 50,
ConnMaxLifetime: 0,
}
logger := kitlog.NewLogfmtLogger(os.Stderr)
logger := logging.NewLogfmtLogger(os.Stderr)
opts := []mysql.DBOption{
mysql.Logger(logger),
mysql.WithFleetConfig(&config.FleetConfig{
+2 -3
View File
@@ -18,9 +18,8 @@ import (
"github.com/WatchBeam/clock"
"github.com/fleetdm/fleet/v4/server/config"
"github.com/fleetdm/fleet/v4/server/datastore/mysql"
"github.com/fleetdm/fleet/v4/server/platform/logging"
"github.com/jmoiron/sqlx"
kitlog "github.com/go-kit/log"
)
func main() {
@@ -145,7 +144,7 @@ func main() {
}
}
logger := kitlog.NewLogfmtLogger(os.Stderr)
logger := logging.NewLogfmtLogger(os.Stderr)
opts := []mysql.DBOption{
mysql.Logger(logger),
mysql.WithFleetConfig(&config.FleetConfig{
+2 -3
View File
@@ -10,9 +10,8 @@ import (
"github.com/fleetdm/fleet/v4/server/config"
"github.com/fleetdm/fleet/v4/server/datastore/mysql"
"github.com/fleetdm/fleet/v4/server/platform/logging"
common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql"
kitlog "github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/jmoiron/sqlx"
)
@@ -36,7 +35,7 @@ func main() {
log.Fatal("Username is required (-user flag)")
}
logger := level.NewFilter(kitlog.NewLogfmtLogger(os.Stderr), level.AllowDebug())
logger := logging.NewLogfmtLogger(os.Stderr)
// Configure MySQL connection with IAM auth
mysqlConfig := &config.MysqlConfig{