gorm sql日志同时打屏和文件

gorm sql日志同时打屏和文件 GORM 的logger.New只接受一个io.Writer要实现同时输出到文件和控制台需要自定义一个io.Writer实现多路写入。解决方案自定义 MultiWritergo复制package main import ( gorm.io/gorm/logger io log os time ) // MultiWriter 同时写入多个目标 type MultiWriter struct { writers []io.Writer } func (m *MultiWriter) Write(p []byte) (n int, err error) { for _, w : range m.writers { n, err w.Write(p) if err ! nil { return n, err } } return len(p), nil } func dbLogger() logger.Interface { // 1. 打开 SQL 日志文件 sqlFile, err : os.OpenFile( ichubconfig.GetBathPath()baseconsts.DbSqlPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666, ) if err ! nil { panic(无法打开 SQL 日志文件: err.Error()) } // 2. 创建多路写入器文件 控制台 multiWriter : MultiWriter{ writers: []io.Writer{ sqlFile, // 写入文件 os.Stdout, // 同时输出到控制台 }, } // 3. 创建 logger return logger.New( log.New(multiWriter, \r\n, log.LstdFlags), logger.Config{ SlowThreshold: time.Second, LogLevel: logger.Info, IgnoreRecordNotFoundError: true, ParameterizedQueries: false, Colorful: false, // 文件输出禁用彩色避免控制台乱码 }, ) }更简洁的方案使用 io.MultiWriterGo 标准库自带io.MultiWriter无需自定义go复制func dbLogger() logger.Interface { sqlFile, err : os.OpenFile( ichubconfig.GetBathPath()baseconsts.DbSqlPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666, ) if err ! nil { panic(无法打开 SQL 日志文件: err.Error()) } // 标准库 MultiWriter同时写入文件和控制台 multiWriter : io.MultiWriter(sqlFile, os.Stdout) return logger.New( log.New(multiWriter, \r\n, log.LstdFlags), logger.Config{ SlowThreshold: time.Second, LogLevel: logger.Info, IgnoreRecordNotFoundError: true, ParameterizedQueries: false, Colorful: false, // 必须 false否则控制台有乱码 }, ) }高级方案区分控制台和文件的日志级别如果希望控制台显示所有日志文件只记录慢查询go复制type levelWriter struct { infoWriter io.Writer // Info 级别输出 slowWriter io.Writer // Slow 级别输出 } func (w *levelWriter) Write(p []byte) (n int, err error) { // 同时写入两个目标 w.infoWriter.Write(p) return w.slowWriter.Write(p) } func dbLogger() logger.Interface { sqlFile, _ : os.OpenFile(sql.log, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) // 控制台彩色文件无彩色 consoleLogger : logger.New( log.New(os.Stdout, \r\n, log.LstdFlags), logger.Config{ SlowThreshold: time.Second, LogLevel: logger.Info, Colorful: true, }, ) // 返回组合 loggerGORM v2 支持多个 logger return logger.New( log.New(io.MultiWriter(sqlFile, os.Stdout), \r\n, log.LstdFlags), logger.Config{ SlowThreshold: time.Second, LogLevel: logger.Info, Colorful: false, }, ) }关键注意点表格配置项建议值说明Colorfulfalse多路输出时必须关闭否则文件会有乱码ParameterizedQueriesfalse显示实际参数值方便调试文件句柄不要defer Close()GORM 是长期使用的在程序退出时关闭使用方式go复制db, err : gorm.Open(mysql.Open(dsn), gorm.Config{ Logger: dbLogger(), // 传入自定义 logger })推荐直接用io.MultiWriter方案代码最简洁无需额外结构体。