新增单行文本编码器与结构化 GORM 日志,统一错误记录与请求日志策略,收紧日志文件权限并修复按天切分与压缩,支付回调参数脱敏,生产强制阿里云短信,RequestID 校验防注入,日志文案中文化。
49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package database
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zaptest/observer"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func TestGormLoggerDoesNotLogQueryParameters(t *testing.T) {
|
|
core, observed := observer.New(zap.DebugLevel)
|
|
logger := zap.New(core)
|
|
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{
|
|
Logger: newGormLogger("debug", logger),
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
type secretRecord struct {
|
|
ID uint64
|
|
Phone string
|
|
}
|
|
if err := db.AutoMigrate(&secretRecord{}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
const secretPhone = "13812345678"
|
|
if err := db.Create(&secretRecord{Phone: secretPhone}).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
for _, entry := range observed.All() {
|
|
for _, value := range entry.ContextMap() {
|
|
if strings.Contains(valueString(value), secretPhone) {
|
|
t.Fatalf("query parameter leaked into log: %v", entry.ContextMap())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func valueString(value any) string {
|
|
if text, ok := value.(string); ok {
|
|
return text
|
|
}
|
|
return ""
|
|
}
|