Skip to content

Commit 691a0cb

Browse files
committed
feat: add debug logging functionality for database operations and reduce logspam on common runs
1 parent 2c05568 commit 691a0cb

File tree

3 files changed

+38
-10
lines changed

3 files changed

+38
-10
lines changed

cmd/keymaster/main.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ var auditMode string // audit mode flag: "strict" (default) or "serial"
5252
var fullRestore bool // Flag for the restore command
5353

5454
var password string // Flag for rotate-key password
55+
var verbose bool
56+
5557
// TODO should be moved to project root
5658
var appConfig config.Config
5759

@@ -224,7 +226,12 @@ system key per account and uses it as a foothold to rewrite and
224226
version-control access. A database becomes the source of truth.
225227
226228
Running without a subcommand will launch the interactive TUI.`,
227-
PersistentPreRunE: setupDefaultServices,
229+
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
230+
if verbose {
231+
db.SetDebug(true)
232+
}
233+
return setupDefaultServices(cmd, args)
234+
},
228235
Run: func(cmd *cobra.Command, args []string) {
229236
// The database is already initialized by PersistentPreRunE.
230237
// i18n is also initialized, so we can just run the TUI.
@@ -246,6 +253,7 @@ Running without a subcommand will launch the interactive TUI.`,
246253
cmd.AddCommand(debugCmd)
247254

248255
// Define flags
256+
cmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "Enable verbose output (sets -v for DB logs)")
249257
cmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file")
250258
cmd.PersistentFlags().String("language", "en", `TUI language ("en", "de")`)
251259
applyDefaultFlags(cmd)

internal/db/db.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"errors"
1515
"fmt"
1616
"io/fs"
17-
"log"
17+
1818
"os"
1919
"path"
2020
"sort"
@@ -87,7 +87,7 @@ func RunDBMaintenance(dbType, dsn string) error {
8787
// PRAGMA optimize may not be supported or useful in some environments
8888
// (e.g., in-memory filesystems); treat optimize errors as non-fatal.
8989
if _, err := sqlDB.ExecContext(ctx, "PRAGMA optimize;"); err != nil {
90-
log.Printf("db: sqlite optimize failed (ignored): %v", err)
90+
dbLogf("db: sqlite optimize failed (ignored): %v", err)
9191
}
9292
if _, err := sqlDB.ExecContext(ctx, "VACUUM;"); err != nil {
9393
return fmt.Errorf("sqlite vacuum failed: %w", err)
@@ -121,8 +121,8 @@ func RunDBMaintenance(dbType, dsn string) error {
121121
return fmt.Errorf("mysql read table name failed: %w", err)
122122
}
123123
if _, err := sqlDB.ExecContext(ctx, fmt.Sprintf("OPTIMIZE TABLE %s", table)); err != nil {
124-
// Non-fatal per-table: log and continue, but remember last error
125-
log.Printf("db: mysql optimize table %s failed: %v", table, err)
124+
// Non-fatal per-table: remember last error and continue
125+
dbLogf("db: mysql optimize table %s failed: %v", table, err)
126126
lastErr = err
127127
}
128128
}
@@ -200,14 +200,13 @@ func NewStoreFromDSN(dbType, dsn string) (Store, error) {
200200
sqlDB.SetConnMaxIdleTime(time.Duration(connIdle) * time.Second)
201201

202202
openDur := time.Since(start)
203-
log.Printf("db: opened %s driver in %s (conn max open=%d, idle=%ds, maxLifetime=%s)", driverName, openDur, maxOpen, connIdle, connMax)
203+
dbLogf("db: opened %s driver in %s (conn max open=%d, idle=%ds, maxLifetime=%s)", driverName, openDur, maxOpen, connIdle, connMax)
204204

205205
migStart := time.Now()
206206
if err := RunMigrations(sqlDB, dbType); err != nil {
207207
return nil, fmt.Errorf("failed to run migrations: %w", err)
208208
}
209-
log.Printf("db: migrations for %s completed in %s", dbType, time.Since(migStart))
210-
209+
dbLogf("db: migrations for %s completed in %s", dbType, time.Since(migStart))
211210
// Create a Bun DB wrapper for the sql.DB based on dialect
212211
bunDB := createBunDB(sqlDB, dbType)
213212
switch dbType {
@@ -244,13 +243,14 @@ func createBunDB(sqlDB *sql.DB, dbType string) *bun.DB {
244243
// RunMigrations applies the necessary database migrations for a given database connection.
245244
func RunMigrations(db *sql.DB, dbType string) error {
246245
start := time.Now()
247-
log.Printf("db: starting migrations for %s", dbType)
246+
dbLogf("db: starting migrations for %s", dbType)
248247
migrationsPath := fmt.Sprintf("migrations/%s", dbType)
249248

250249
entries, err := fs.ReadDir(embeddedMigrations, migrationsPath)
251250
if err != nil {
252251
if errors.Is(err, fs.ErrNotExist) {
253252
// No migrations embedded for this DB type.
253+
dbLogf("db: applied migrations for %s in %s", dbType, time.Since(start))
254254
return nil
255255
}
256256
return fmt.Errorf("failed to read embedded migrations (%s): %w", migrationsPath, err)
@@ -325,7 +325,7 @@ func RunMigrations(db *sql.DB, dbType string) error {
325325
return fmt.Errorf("failed to commit migration %s: %w", version, err)
326326
}
327327
}
328-
log.Printf("db: applied migrations for %s in %s", dbType, time.Since(start))
328+
329329
return nil
330330
}
331331

internal/db/log.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright (c) 2025 ToeiRei
2+
// Keymaster - SSH key management system
3+
// This source code is licensed under the MIT license found in the LICENSE file.
4+
5+
package db
6+
7+
import "log"
8+
9+
var debugEnabled bool
10+
11+
// SetDebug enables or disables DB debug logging. Disabled by default.
12+
func SetDebug(enabled bool) {
13+
debugEnabled = enabled
14+
}
15+
16+
func dbLogf(format string, v ...any) {
17+
if debugEnabled {
18+
log.Printf(format, v...)
19+
}
20+
}

0 commit comments

Comments
 (0)