feat(conga,lagoon): River and GORM log through diary components

- River's logger is diary.For("river") (warn by default), conga's own lines diary.For("conga"); an app-published logger still wins
- GORM logs through logger.NewSlogLogger(diary.For("db")): warn level, record-not-found ignored, parameterized SQL traces only at verbosity 3
- Smoke tests TestRiverLoggerUsesDiarySmoke and TestGormLoggerUsesDiarySmoke
This commit is contained in:
Jakub Zych
2026-10-21 11:51:57 +02:00
parent 5b09b32512
commit e6b20e2cb6
8 changed files with 142 additions and 10 deletions

View File

@@ -5,12 +5,15 @@ import (
"database/sql"
"fmt"
"strings"
"time"
"git.golem15.com/golem15/summercms/modules/backpack"
"git.golem15.com/golem15/summercms/modules/compass"
"git.golem15.com/golem15/summercms/modules/diary"
_ "github.com/jackc/pgx/v5/stdlib"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
// Open pings dsn through pgx stdlib and returns that exact *sql.DB plus a
@@ -53,8 +56,26 @@ func Use(ctx context.Context, sqlDB *sql.DB) (*gorm.DB, error) {
return gormFromSQL(sqlDB)
}
// gormLogger routes GORM's lines through diary as component db instead of
// GORM's default stdout logger: slow queries (over 200ms) and errors at warn,
// record-not-found ignored, and SQL traces only at verbosity 3 (-vvv), with
// parameterized queries so bound values never reach a log line.
func gormLogger() logger.Interface {
level := logger.Warn
if diary.Verbosity() >= 3 {
level = logger.Info
}
return logger.NewSlogLogger(diary.For("db"), logger.Config{
SlowThreshold: 200 * time.Millisecond,
LogLevel: level,
IgnoreRecordNotFoundError: true,
// Log SQL with placeholders, never with the bound values.
ParameterizedQueries: true,
})
}
func gormFromSQL(sqlDB *sql.DB) (*gorm.DB, error) {
gdb, err := gorm.Open(postgres.New(postgres.Config{Conn: sqlDB}), &gorm.Config{})
gdb, err := gorm.Open(postgres.New(postgres.Config{Conn: sqlDB}), &gorm.Config{Logger: gormLogger()})
if err != nil {
return nil, fmt.Errorf("lagoon: gorm open: %w", err)
}