必须显式启用xorm日志并注入上下文才能实时查看SQL语句、参数及耗时;需实现含BeforeProcess和AfterProcess的Hook,AddHook须在操作前调用,且所有操作必须通过engine.Context(ctx)获取session。

要在Go项目中实时看到xorm执行的每一条SQL语句及其参数、耗时,必须显式启用日志功能并正确注入上下文,否则即使调用AddHook也看不到任何SQL输出。
启用xorm全局SQL日志输出
第一步:创建一个实现了xorm.Hook接口的SQLLogger实例,它必须同时实现BeforeProcess和AfterProcess方法;【缺少AfterProcess会导致日志完全不打印】
第二步:在初始化xorm.Engine后,立即调用engine.AddHook(NewSQLLogger(true)),注意这个调用必须在任何数据库操作之前完成,否则后续Session将无法触发日志钩子。
第三步:确保所有数据库操作都通过带上下文的Session执行,即使用engine.Context(ctx)获取session,而不是直接用engine.NewSession()——后者会丢失ctx中的日志上下文信息。
快速验证SQL是否正常输出
方法一:在main函数或初始化逻辑末尾添加一行测试查询:
_, _ = engine.ID(1).Get(&User{})
方法二:启动应用后,向任意触发数据库读写的HTTP端点发起一次请求,观察控制台是否立即出现形如“SQL: SELECT * FROM user WHERE id = ?, Args: [1], ExecTime: 1.234ms”的日志行。
如果没输出,检查是否漏掉了engine.Context(ctx)这一步——这是最常见的失败原因,且不会报错,只会静默丢弃日志。
定制日志内容与格式
在SQLLogger.AfterProcess方法中,直接修改logger.Infof那一行即可调整输出格式。例如把Args: %v改成Args: %#v能显示更清晰的参数结构体字段值;把c.ExecuteTime改成c.ExecuteTime.Microseconds()可改用微秒单位。
若只想记录慢查询(比如超过50ms),可在AfterProcess开头加判断:if c.ExecuteTime
注意:日志级别由底层logger决定,xorm本身不控制info/warn/error分级,需确保你使用的logger(如logrus或zap)已配置为输出Info级别。











