db/Log.go

75 lines
1.6 KiB
Go

package db
import (
"apigo.cc/go/cast"
"apigo.cc/go/log"
)
type DBLog struct {
DbType string `log:"pos:10,color:blue"`
Dsn string `log:"pos:11,color:gray,withoutkey:true"`
Query string `log:"pos:12,color:cyan"`
QueryArgs string `log:"pos:13,color:gray"`
UsedTime float32 `log:"pos:14,format:%.2fms"`
}
type DBInfoLog struct {
log.InfoLog
DBLog
}
type DBErrorLog struct {
log.ErrorLog
DBLog
}
func init() {
log.RegisterType(log.LogTypeDb, DBInfoLog{})
log.RegisterType(log.LogTypeDbError, DBErrorLog{})
}
func (dl *dbLogger) LogDB(query string, args []any, usedTime float32, err error, extra ...any) {
LogDB(dl.logger, dl.config, query, args, usedTime, err, extra...)
}
func LogDB(logger *log.Logger, conf *Config, query string, args []any, usedTime float32, err error, extra ...any) {
if logger == nil {
return
}
if err != nil {
if logger.CheckLevel(log.ERROR) {
entry := log.GetEntry[DBErrorLog]()
entry.LogType = log.LogTypeDbError
entry.Error = err.Error()
entry.DBLog = DBLog{
DbType: conf.Type,
Dsn: conf.Dsn(),
Query: query,
QueryArgs: cast.To[string](args),
UsedTime: usedTime,
}
if len(extra) > 0 {
cast.FillMap(&entry.Extra, extra)
}
logger.Log(entry)
}
} else {
if logger.CheckLevel(log.INFO) {
entry := log.GetEntry[DBInfoLog]()
entry.LogType = log.LogTypeDb
entry.DBLog = DBLog{
DbType: conf.Type,
Dsn: conf.Dsn(),
Query: query,
QueryArgs: cast.To[string](args),
UsedTime: usedTime,
}
if len(extra) > 0 {
cast.FillMap(&entry.Extra, extra)
}
logger.Log(entry)
}
}
}